将 std::mutex 用于由 boost::asio 管理的线程池

2023-12-09

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

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

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


正如其他人指出的那样,std::mutex和其他锁定机制,可以在处理程序中使用。然而,两者之间有一个根本的区别:

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

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

考虑以下场景:

  • 2 个线程的线程池是使用 Boost.Asio 实现的。
  • 处理程序A and B将在同一个互斥体上同步。
  • Handler C不需要同步。
  • 处理程序A, B, and C被张贴到io_service.

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

如果在这种情况下使用链进行同步,则不会发生这种饥饿情况。 Astrand维护自己的处理程序队列,并保证只有一个处理程序在队列中io_service,导致处理程序在放入之前被同步io_service。在该场景中,如果A and B被张贴到strand,那么strand将发布A进入io_service。这会导致A and C处于io_service,允许C同时运行B仍留在strand的队列等待A去完成。

此外,在某些用例中,这两种形式的同步可以一起使用。例如,考虑与线程池外部运行的线程共享资源的情况。线程池内部和外部的线程仍然需要互斥体。然而,一个strand可用于消除线程池内部线程之间对互斥体的争用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 std::mutex 用于由 boost::asio 管理的线程池 的相关文章

随机推荐