使用std :: mutex作为boost :: asio管理的线程池

Haa*_*hii 3 c++ multithreading boost boost-asio c++11

不知怎的,这个问题的后续行动.我只是想知道是否可以使用一个被std::mutex函数处理的函数boost::asio:io_service?使用股线是不切实际的.从我在boost参考中找到的我会说它没问题.既然它说明了这一点

只能从当前调用io_service :: run()的线程调用异步完成处理程序.

所以boost创建的其他线程不应该干扰.我做对了吗?

Tan*_*ury 11

正如其他人所指出的,std::mutex以及其他锁定机制,可以在处理程序中使用.但是,两者之间存在根本区别:

  • 处理程序中的外部锁定机制用于保护资源免受竞争条件的影响.
  • A strand用于消除处理程序之间的争用,从而消除处理程序之间的竞争条件.

如果整个处理程序由于与其他处理程序的潜在竞争条件而被同步,而不是线程池外部的线程,那么我想强调外部机制和之间的同步中的一个细微差别boost::asio::strand.

请考虑以下情形:

  • 使用Boost.Asio实现2个线程的线程池.
  • 处理程序A,并B会在同一个互斥体同步.
  • 处理程序C不需要同步.
  • 处理程序A,B并且C被发布到io_service.

A并被B调用.由于外部同步,线程池现在已耗尽,因为正在使用两个线程.不幸的是,其中一个线程在资源上被阻塞,导致不需要同步的处理程序(例如)C位于队列中.

如果在此方案中使用strand进行同步,则不会发生此饥饿实例.A strand维护自己的处理程序队列,并保证只有一个处理程序在其中io_service,导致处理程序在被放入之前被同步io_service.在场景中,如果AB被发布到strand,那么strand将发布Aio_service.这将导致AC进入io_service,允许C同时运行,同时B保留在strand等待A完成的队列中.

此外,还有一些用例可以同时使用这两种形式的同步.例如,考虑资源与在线程池外部运行的线程共享的情况.线程池内部和外部的线程仍然需要互斥锁.但是,strand可以使用a来消除线程池内部线程之间的互斥锁争用.


Sam*_*ler 8

是的,使用std::mutex处理程序内部是完全正常的.A strand毕竟只是一个带伪装互斥的队列.