【问题标题】:What does concurrency_hint of boost::asio::io_service means?boost::asio::io_service 的 concurrency_hint 是什么意思?
【发布时间】:2016-11-27 12:50:03
【问题描述】:

来自boost doc

io_service( std::size_t concurrency_hint);
构造时提示所需的并发级别。

参数

concurrency_hint 对实现数量的建议 它应该允许同时运行的线程。

“对实施的建议”是什么意思?

如果我用'2'构造对象,它只能启动1个线程吗?
如果我有一个 4 核的 CPU,我用“4”或“5”构造对象会发生什么?

【问题讨论】:

    标签: c++ multithreading boost boost-asio


    【解决方案1】:

    并发提示允许底层实现根据应该运行io_service 的并发线程数量做出选择。例如:

    • 对于 I/O 完成端口,它设置完成端口的最大并发级别。并发提示作为NumberOfConcurrentThreads 参数提供给CreateIoCompletionPort()。有关详细信息,请参阅I/O Completion Ports 文档:

      此值限制与完成端口关联的可运行线程的数量。当与完成端口关联的可运行线程总数达到并发值时,系统会阻止与该完成端口关联的任何后续线程的执行,直到可运行线程数降至并发值以下。

    • 当设置为 1 时,优化实现以避免不必要的锁定。 Revision History 备注:

      在单线程用例(即concurrency_hint 为 1 时)使用线程本地操作队列来消除锁定/解锁对。

    【讨论】:

    • 感谢您的回答,如果我没看错请告诉我:所以concurrency_hint 表示线程队列的大小?它与CPU中的实际内核数无关,只是说:“你可以在这个io_service中运行最多X个并发线程?
    • @hudac 是的。对于 I/O 完成端口,concurrency_hint 设置线程队列的上限。核心将限制线程并行性,但线程并发可以超过核心数量。链接的 I/O 完成端口文档为 NumberOfConcurrentThreads 值和线程池大小提供了建议。
    • 那为什么叫concurrency_hint而不是concurrency?看起来提示是队列大小本身,不是吗?除了 I/O completion ports 之外,你的答案会改变吗?我的意思是,对于任何拥有套接字、文件描述符、事件 fds、计时器 fds 的 boost::asio::io_service...
    • @hudac 我认为用 hint 限定参数是合适的。 Asio 既不强制也不保证并发级别。目前,对于基于io_service 的任务,大于1 的conccurency_hint 没有影响。对于 I/O 完成端口,在某些条件下,并发可以超过 NumberOfConcurrentThreads 的值。
    • "目前,对于基于任务的 io_service,conccurency_hint 大于 1 没有影响" - 这是底线。非常感谢。我试着用conccurency_hint > 1 运行一个例子,它真的没有什么特别的。这很奇怪,因为我记得我已经成功地做到了.. ;/
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2019-01-22
    • 2017-09-17
    • 2012-11-26
    • 2011-12-18
    相关资源
    最近更新 更多