我正在尝试在多个线程中使用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
。
是否有解决错误的建议?
答案 0 :(得分:2)
您可能会像这样去lambda:
#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;
}
编辑:
Miles Budnek正确地指出,io_context :: run具有多个重载。在不强制使用强制转换超载分辨率的情况下,您无法获得指向它的指针。
如果您真的想使用std::bind
,请进行投射。
我的观点与其他人相同。去lambda !!