asio::io_context 和 asio::thread_pool 有什么区别?
What's the difference between asio::io_context and asio::thread_pool?
从多个线程调用run()
函数的asio::thread_pool
和asio::io_context
有什么区别?我可以用asio::thread_pool
替换调用io_context::run()
的线程boost::thread_group
吗?还是我需要某个地方io_context
?
更新
当我使用asio::thread_pool
时,我还需要一个io_context
来使用插座、计时器等吗?thread_pool
和io_context
都是asio::execution_context
。但是,文档在io_context
上说它"提供核心I/O功能"。如果我只使用没有io_context
的asio::thread_pool
,我会丢失这些吗?
线程池隐式运行其上发布的所有任务(直到停止(。
io_service不假设将运行它的线程的任何内容:您需要确保这样做,并且您可以自由决定是在多个线程、一个线程还是混合上运行它(例如一次一个线程,但来自多个线程?
进一步说明:
- 处理来自
io_service
运行/轮询成员的异常(是否应该捕获 boost::asio::io_service::run(( 引发的异常? - 如果在多个线程上运行io_service,请确保您了解所用服务对象的线程安全性(请参阅为什么使用 boost::asio 时每个连接需要 strand ?
- 如果您知道有多少线程将运行您的服务,请考虑在构造 (https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/overview/core/concurrency_hint.html( 上提供并发提示
io_service
可以重新启动(reset()
后(。asio::thread_pool
不是那么多(参见[搜索已死ATM],与asio::io_service和thread_group生命周期问题进行比较(- 由
asio::thread_pool
管理的线程是"不透明的":您无法控制它们的创建方式。如果您需要例如初始化每个线程的第三方库或想要将 Boost Thread 与interruption_point
s 等一起使用,那就太糟糕了。
相关文章:
- 通过boost asio iostream下载大文件的最快方法是什么?
- asio::io_context 和 asio::thread_pool 有什么区别?
- 调用boost.asio的异步函数时,线程是什么时候创建的
- 在 boost::asio 中发布和调度有什么区别?
- C++ 关闭Boost ASIO SSL套接字的最佳方法是什么?
- boost::asio::io_service::run() 实际上做了什么
- 当TCP TX缓冲区填满时,boost::asio中会发生什么
- 在Boost库asio示例中,处理程序分配之前的[this,self]意味着什么
- boost.asio和目前的网络TS之间最大的区别是什么
- boost::asio::ssl::stream<boost::asio::ip::tcp::socket>::shutdown() 做什么?
- boost::asio:"strand"类型的同步原语有什么名称吗?
- boost asio serial_port_service和serial_port有什么区别
- strand在boost asio中的优势是什么?
- 什么处理程序增强.Asio在幕后执行
- Boost::asio这种奇怪的编码风格是什么
- 使用asio::async_read的正确模式是什么?
- Boost ASIO -什么是异步
- 安全断开asio SSL套接字的正确方法是什么?
- 什么是boost::asio::ssl::context::load_verify_file以及如何使用它
- boost::asio::ip::tcp::socket::cancel和socket::close之间有什么不同