io_service在线程内运行

卡宾曼

为什么在这个简单的类中,如果我直接使用io.run(),则将调用该函数,否则,如果要求运行到其他线程,则将不会调用打印?

#include <iostream>
#include <boost/thread.hpp>
#include <boost/asio.hpp>

using namespace std;

class test
{
  public:
    test()
    {
      io.post(boost::bind(&test::print, this));
      //io.run();
      t = boost::thread(boost::bind(&boost::asio::io_service::run, &io));
    }

    void print()
    {
      cout << "test..." << endl;
    }

  private:
    boost::thread t;
    boost::asio::io_service io;
};

int main()
{
  test();
  return 0;
}
坦纳·桑斯伯里(Tanner Sansbury)

线程对象在io_service完全允许运行之前被销毁thread析构函数文档状态:

[...]程序员必须确保在线程仍可连接时永远不要执行析构函数。

如果BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE已定义,则程序将中止,因为线程析构函数将调用std::terminate()


如果io_service应该运行完成,请考虑在Test析构函数中加入线程这是一个完整的示例,演示了在线程完成时进行同步:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>

class test
{
public:
  test()
  {
    io.post(boost::bind(&test::print, this));
    t = boost::thread(boost::bind(&boost::asio::io_service::run, &io));
  }

  ~test()
  {
    if (t.joinable())
      t.join();  
  }

  void print()
  {
    std::cout << "test..." << std::endl;
  }

private:
  boost::thread t;
  boost::asio::io_service io;
};

int main()
{
  test();
  return 0;
}

输出:

test...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Boost线程中运行boost asio io_service

从多个线程调用boost :: asio :: io_service运行函数

两个线程运行相同的io_service

在结构内创建绑定到io_service的线程

从boost :: asio :: io_service :: work作为分离线程运行时捕获异常

永远运行boost asio io_service

Boost Asio,多个线程和多个io_service

在每个线程完成后停止 io_service

杀死在线程内运行的子进程

不保持 io_service 运行的 Boost asio 处理程序

io_service运行后创建套接字

从线程池调用时,boost的io_service是否共享请求线程?

什么是asio :: io_service?

Java:在线程内运行时 JNDI 查找失败

使用相同的Boost.Asio io_service同步并作为线程池接受TCP连接

即使异步I / O操作正在挂起,也只有线程处理io_service在等待

在同一io_service对象上增强异步套接字和线程池

当boost :: asio :: io_service运行方法阻塞/取消阻塞时感到困惑

在boost :: asio :: io_service上运行时调用时崩溃

扭曲 - 在线程中运行

asio :: io_service立即结束工作

使io_service保持活动状态

Boost 1.70 io_service弃用

在线程内打印参数

在boost :: asio :: io_service :: work被销毁后,asio :: io_service :: run不返回

提升Asio io_service与io_context

永远在线程内运行 Python 3 asyncio.coroutine

在线程内的异步循环中运行的 Websocket 立即断开连接

以嵌套或递归方式(即在处理程序内)调用asio io_service poll()或poll_one()是否有效?