ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?

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_poolasio::io_context谁的run()函数是从多个线程调用的,有什么区别?我可以将调用io_context::run()的线程的boost::thread_group替换为asio::thread_pool吗?或者我需要一个io_context

更新

当我使用asio::thread_pool时,我是否仍然需要io_context来使用套接字、计时器等?thread_poolio_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有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

socks4 with asynchronous boost::asio(带有异步Boost::ASIO的socks4)
Boost ASIO HTTP client POST(增强ASIO HTTP客户端开机自检)
asio::strandlt;asio::io_context::executor_typegt; vs io_context::strand(Asio::strandlt;asio::io_context::executor_typegt;VS io_CONTEXT::Strand)
How to use boost::asio with Linux GPIOs(如何在Linux GPIO中使用Boost::ASIO)
Boost asio io_service vs io_context(增强ASIO io_服务与io_Context)
io_service, why and how is it used?(IO_SERVICE,为什么以及如何使用它?)