What#39;s the difference between asio::io_context and asio::thread_pool?(ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?)
本文介绍了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等一起使用,这将是一件令人沮丧的事情。
这篇关于ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?


猜你喜欢
- DoEvents 等效于 C++? 2021-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- 将 hdc 内容复制到位图 2022-09-04
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- GDB 不显示函数名 2022-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- XML Schema 到 C++ 类 2022-01-01