ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?
asio::thread_pool
和asio::io_context
谁的run()
函数是从多个线程调用的,有什么区别?我可以将调用io_context::run()
的线程的boost::thread_group
替换为asio::thread_pool
吗?或者我需要一个io_context
?
更新
当我使用asio::thread_pool
时,我是否仍然需要io_context
来使用套接字、计时器等?thread_pool
和io_context
都是asio::execution_context
。然而,文档在io_context
上说它"提供核心I/O功能"。如果我只使用asio::thread_pool
而不使用io_context
,我会丢失这些吗?
解决方案
隐式线程池运行发布在其上的所有任务(直到它停止)。
io_service不假定将运行它的线程的任何内容:您需要确保这样做,并且您可以自由地决定是在多个线程上运行它,还是在一个线程上运行,甚至可以在混合线程上运行(就像一次运行一个线程,但从多个线程运行?)。
进一步说明:
- 处理来自
io_service
运行/轮询成员(Should the exception thrown by boost::asio::io_service::run() be caught?)的异常 - 如果您在多个线程上运行io_service,请确保了解您使用的服务对象的线程安全性(请参阅Why do I need strand per connection when using boost::asio?)
- 如果您知道有多少线程将运行您的服务,请考虑在构造时提供并发提示(https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/overview/core/concurrency_hint.html)
io_service
可以重启(在reset()
之后)。asio::thread_pool
不是很多(参见[搜索是dead atm],对比asio::io_service and thread_group lifecycle issue)- 由
asio::thread_pool
管理的线程是"不透明的":您无法控制它们是如何创建的。如果您需要按线程初始化第三方库,或者希望将Boost Thread与interruption_point
s等一起使用,这将是一件令人沮丧的事情。
相关文章