Ошибка компиляции C ++ при запуске io_context в другом потоке - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь использовать asio :: io_context в нескольких потоках.

#include <iostream>
#include <vector>
#include <asio.hpp>
#include <thread>
#include <future>
#include <functional>

int main()
{
    asio::io_context ctx;

    std::vector<std::future<asio::io_context::count_type>> tasks;
    for(int i = 0; i < 3; ++i)
    {
        tasks.push_back(std::async(std::launch::async, std::bind(&asio::io_context::run, &ctx));
    }

    for(auto &task: tasks){tasks.get();}
    return 0;
}

Однако я получаю ошибку компиляции

asio_blah.cpp: In function ‘int main()’:
asio_blah.cpp:101:94: error: no matching function for call to ‘bind(<unresolved overloaded function type>, asio::io_context*)’
         tasks.push_back(std::async(std::launch::async, std::bind(&asio::io_context::run, &ctx));

Не уверен, что компилятор невозможность определить указатель на функцию-член (я полагаю, что тип функции-члена равен asio::io_context::count_type (asio::io_context*)(), а сигнатура функции должна быть видимой для компилятора, поскольку включен asio.hpp) и сообщить об ошибке unresolved overloaded function type.

Любые предложенияисправить ошибку?

1 Ответ

0 голосов
/ 28 декабря 2018

Вы можете перейти к лямбде примерно так:

#include <iostream>
#include <vector>
#include <boost/asio.hpp>
#include <thread>
#include <future>
#include <functional>

using namespace boost;

int main()
{
    asio::io_context ctx;

    std::vector<std::future<asio::io_context::count_type>> tasks;
    for(int i = 0; i < 3; ++i)
    {
        tasks.push_back(std::async(std::launch::async, [&ctx]() {
            return ctx.run();
        }));
    }

    for(auto &task: tasks){task.get();}
    return 0;
}

Редактировать:

Как правильно сказал Майлз Буднек , io_context:: run имеет несколько перегрузок.Вы не можете взять указатель на него без принудительного разрешения перегрузки с помощью приведения.

Если вы действительно хотите использовать std::bind, перейдите к приведению.

Мое мнение такое же, как и у других.ПОЙДИТЕ В ЛАМБДУ !!!

...