Boost Asio 中的线程和基本原理
来源:互联网 发布:电信的客户端软件 编辑:程序博客网 时间:2024/06/07 14:42
说到Boost.Asio的线程时,我们经常在讨论:
- io_service:io_service是线程安全的。几个线程可以同时调用io_service::run()。大多数情况下你可能在一个单线程函数中调用io_service::run(),这个函数必须等待所有异步操作完成之后才能继续执行。然而,事实上你可以在多个线程中调用io_service::run()。这会阻塞所有调用io_service::run()的线程。只要当中任何一个线程调用了io_service::run(),所有的回调都会同时被调用;这也就意味着,当你在一个线程中调用io_service::run()时,所有的回调都被调用了。
- socket:socket类不是线程安全的。所以,你要避免在某个线程里读一个socket时,同时在另外一个线程里面对其进行写入操作。(通常来说这种操作都是不推荐的,更别说Boost.Asio)。
- utility:就utility来说,因为它不是线程安全的,所以通常也不提倡在多个线程里面同时使用。里面的方法经常只是在很短的时间里面使用一下,然后就释放了。
注意:如果没有其他需要监控的操作,service.run()就会结束,就像下面的代码片段:
io_service service;tcp::socket sock(service);sock.async_connect( ep, connect_handler);service.run();在上面的例子中,只要sock建立了一个连接,connect_handler就会被调用,然后接着service.run()就会完成执行。
如果你想要service.run()接着执行,你需要分配更多的工作给它。
这里有两个方式来完成这个目标。一种方式是在connect_handler中启动另外一个异步操作来分配更多的工作。 另一种方式会模拟一些工作给它,用下面的代码片段:
typedef boost::shared_ptr work_ptr;work_ptr dummy_work(new io_service::work(service));
上面的代码可以保证service.run()一直运行直到你调用useservice.stop()或者 dummy_work.reset(0);// 销毁dummy_work.
阅读全文
0 0
- Boost Asio 中的线程和基本原理
- Boost.Asio中的线程
- qt和boost.asio
- c++boost中的asio介绍
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
- boost asio 性能与线程安全性
- boost::asio io线程退出的问题
- boost asio 单线程的异步
- boost的asio中的read_util问题
- boost的asio中的buffer的使用
- boost的asio使用中的一个问题
- 犯错误了,boost中的asio的asyncWrite
- 犯错误了,boost中的asio的asyncWrite
- Boost::asio中的异步回调
- boost中的asio实现定时器功能
- 异步服务端中的多线程 boost asio
- Boost Asio
- boost asio
- Java记录 -11- 面向对象之封装续II
- storm记录--9- Storm Topology的并发度
- 拉格朗日插值法(伪代码 c/c++ python 实现)
- storm记录--10- Storm消息机制
- Java记录 -12- 方法重载与重写
- Boost Asio 中的线程和基本原理
- Java记录 -13- 面向对象之继承
- Java记录 -14- 面向对象之多态
- Leetcode 125 Valid Palindrome
- Java记录 -15- 面向对象之多态续
- Java记录 -16- 抽象类及接口
- Java记录 -17- static与final关键字
- Java记录 -18- static与final关键字续
- storm记录--11- Storm DRPC实战