使用std ::互斥通过提升管理的线程池:: ASIO(Use std::mutex for a t

2019-07-18 03:57发布

不知怎么的后续这个问题 。 我只是想知道,如果它是确定使用std::mutex函数由handeled boost::asio:io_service ? 股的用法是somwhat不现实的。 从我在发现升压参考我会说这是确定的。 因为它指出

异步完成处理程序将只从当前正在调用io_service对象线程调用运行::()。

因此,通过推动创建其他线程不应该干涉。 难道我得到它的权利?

Answer 1:

是的,使用std::mutex处理程序的内部是完全正常的。 一个strand仅仅是一个毕竟变相的互斥体队列。



Answer 2:

正如其他人指出, std::mutex和其他锁定机制,可将处理程序中使用。 但是,两者之间的根本区别:

  • 一个处理器内的外部锁定机制是用来保护资源的竞争条件。
  • strand是用来处理程序之间除去争用,从而导致去除处理程序之间的竞争条件。

如果整个处理程序被同步作为与其他处理程序潜在竞争条件,而不是螺纹外部的线程池的结果,那么我想到外部机构之间突出的细微区别之一同步地和boost::asio::strand

考虑以下情形:

  • 的2个线程甲线程池与Boost.Asio的实现。
  • 处理程序AB将在相同的互斥同步。
  • 处理程序C不需要同步。
  • 处理程序AB ,和C被张贴到io_service

AB被调用。 线程池现在用尽由于外部同步,因为正在使用两个线程。 不幸的是,其中一个线程被阻塞上的资源,从而导致需要没有同步,诸如处理程序C ,在队列中的坐。

如果一个股被用于同步在这种情况下,那么饥饿的这种情况就不会发生。 甲strand保持其自己的处理程序的队列,并且可以保证只有其处理程序中的一个是在io_service ,导致处理程序在放入之前被同步io_service 。 在该方案中,如果AB都贴到strand ,那么strand将发布A进入io_service 。 这将导致AC在被io_service ,使C而同时运行B留在strand的排队等待A完成。

此外,存在其中这两种形式的同步可以一起使用的用例。 例如,考虑在资源与所述线程池的线程中运行外共享的情况。 互斥,仍然由线程内部和外部的线程池是必需的。 然而, strand可以用来除去争用线程内部的线程池之间的互斥。



Answer 3:

boost是简单地调用其观点回调。 这个回调有没有关系, boost ,因此boost不在乎你在回调做什么。 因此,采取锁(使用任何你想要的锁定库),是完全正常的。



Answer 4:

完成处理程序中的互斥可以阻止线程执行。 在这种情况下,你需要更多的io_service的线程比boost::thread::hardware_concurrency()来加载CPU为100%。 它增加线程切换的开销。



文章来源: Use std::mutex for a thread pool managed by boost::asio