3

不知何故,这个问题的后续行动。我只是想知道是否可以使用std::mutex由 a 处理的 in 函数boost::asio:io_service?股线的使用有点不切实际。根据我在boost 参考中找到的内容,我会说没关系。既然它指出

异步完成处理程序只会从当前正在调用 io_service::run() 的线程中调用。

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

4

4 回答 4

12

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

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

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

考虑以下场景:

  • Boost.Asio 实现了 2 个线程的线程池。
  • 处理程序AB将在同一个互斥锁上同步。
  • 处理程序C不需要同步。
  • 处理程序A,BC发布到io_service.

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

If a strand is used for synchronization in this scenario, then this instance of starvation would not have occurred. A strand maintains its own handler queue, and guarantees that only one of its handlers is in the io_service, resulting in handlers being synchronized before being placed into the io_service. In the scenario, if A and B are posted into the strand, then the strand will post A into the io_service. This would result in A and C being in the io_service, allowing C to run concurrently while B remains in the strand's queue waiting for A to complete.

Also, there are use cases where both of these forms of synchronization can be used together. For example, consider the case where resources are shared with a thread running outside of the threadpool. A mutex would still be required by threads internal and external to the threadpool. However, a strand could be used to remove the contention for the mutex between threads internal to the threadpool.

于 2013-01-14T14:59:53.517 回答
8

是的,使用std::mutex处理程序的内部非常好。strand毕竟,A只是一个带有互斥锁的队列。

于 2013-01-14T01:44:40.163 回答
2

boost只是从它的角度调用回调。这个回调与 没有关系boost,所以boost不在乎你在回调中做了什么。因此,锁定(使用您想要的任何锁定库)非常好。

于 2013-01-14T01:45:38.040 回答
0

Mutex inside completion handler can block thread execution. In that case you need more io_service threads than boost::thread::hardware_concurrency() to load CPU for 100%. It increases thread switching overhead.

于 2014-03-28T01:44:09.130 回答