C++ 有关在不同线程中运行io_context的编译错误

C++ Compilation error about running io_context in different thread

本文关键字:io context 错误 编译 运行 线程 C++      更新时间:2023-10-16

我正在尝试在多个线程中使用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

有什么建议可以修复错误吗?

你可以选择这样的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,去选角吧。

我的意见和其他人一样。去找拉姆达

!!