【问题标题】:Calling boost::asio::io_service::run from a std::thread从 std::thread 调用 boost::asio::io_service::run
【发布时间】:2014-06-09 01:39:48
【问题描述】:

我有一个类来处理我的连接,它有一个 boost::asio::io_service 成员。我想从 std::thread 调用 io_service::run(),但我遇到了编译错误。

std::thread run_thread(&boost::asio::io_service, std::ref(m_io_service));

不起作用。我看到了使用 boost::thread 执行此操作的各种示例,但我想为此坚持使用 std::thread。有什么建议?

谢谢

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    据我所知有两种方法,一种是通过lambda创建std::thread。

    std::thread run_thread([&]{ m_io_service.run(); });
    

    另一个是用 boost::bind 创建 boost::thread

    boost::thread run_thread(boost::bind(&boost::asio::io_service::run, boost::ref(m_io_service)));
    

    【讨论】:

    • Lambda 是通往这里的路,谢谢!绝对是最干净的解决方案。
    • io_context.run() 可以用来代替 io_service.run()。
    【解决方案2】:

    只是扩展了@cbel 的答案。如果您(无论出于何种原因)想避免使用 boost::thread 和 lambdas 的另一种方法:

    std::thread run_thread(
        std::bind(static_cast<size_t(boost::asio::io_service::*)()>(
            &boost::asio::io_service::run), std::ref(m_io_service)));
    

    【讨论】:

      【解决方案3】:

      对我来说,标记为解决方案的答案的两个选项确实导致异常。

      它为我做了什么:

      boost::thread run_thread([&] { m_io_service.run(); });
      

      而不是

      std::thread run_thread([&]{ m_io_service.run(); });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多