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以及其他锁定机制,可以在处理程序中使用.但是,两者之间存在根本区别:
strand用于消除处理程序之间的争用,从而消除处理程序之间的竞争条件.如果整个处理程序由于与其他处理程序的潜在竞争条件而被同步,而不是线程池外部的线程,那么我想强调外部机制和之间的同步中的一个细微差别boost::asio::strand.
请考虑以下情形:
A,并B会在同一个互斥体同步.C不需要同步.A,B并且C被发布到io_service.A并被B调用.由于外部同步,线程池现在已耗尽,因为正在使用两个线程.不幸的是,其中一个线程在资源上被阻塞,导致不需要同步的处理程序(例如)C位于队列中.
如果在此方案中使用strand进行同步,则不会发生此饥饿实例.A strand维护自己的处理程序队列,并保证只有一个处理程序在其中io_service,导致处理程序在被放入之前被同步io_service.在场景中,如果A和B被发布到strand,那么strand将发布A到io_service.这将导致A并C进入io_service,允许C同时运行,同时B保留在strand等待A完成的队列中.
此外,还有一些用例可以同时使用这两种形式的同步.例如,考虑资源与在线程池外部运行的线程共享的情况.线程池内部和外部的线程仍然需要互斥锁.但是,strand可以使用a来消除线程池内部线程之间的互斥锁争用.
| 归档时间: | 
 | 
| 查看次数: | 1704 次 | 
| 最近记录: |