不知何故的后续这个问题。我只是想知道是否可以使用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(使用前将#替换为@)