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_points等一起使用,这将是一件令人沮丧的事情。
这篇关于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
