不知怎么的后续这个问题 。 我只是想知道,如果它是确定使用std::mutex
函数由handeled boost::asio:io_service
? 股的用法是somwhat不现实的。 从我在发现升压参考我会说这是确定的。 因为它指出
异步完成处理程序将只从当前正在调用io_service对象线程调用运行::()。
因此,通过推动创建其他线程不应该干涉。 难道我得到它的权利?
不知怎么的后续这个问题 。 我只是想知道,如果它是确定使用std::mutex
函数由handeled boost::asio:io_service
? 股的用法是somwhat不现实的。 从我在发现升压参考我会说这是确定的。 因为它指出
异步完成处理程序将只从当前正在调用io_service对象线程调用运行::()。
因此,通过推动创建其他线程不应该干涉。 难道我得到它的权利?
是的,使用std::mutex
处理程序的内部是完全正常的。 一个strand
仅仅是一个毕竟变相的互斥体队列。
正如其他人指出, std::mutex
和其他锁定机制,可将处理程序中使用。 但是,两者之间的根本区别:
strand
是用来处理程序之间除去争用,从而导致去除处理程序之间的竞争条件。 如果整个处理程序被同步作为与其他处理程序潜在竞争条件,而不是螺纹外部的线程池的结果,那么我想到外部机构之间突出的细微区别之一同步地和boost::asio::strand
。
考虑以下情形:
A
和B
将在相同的互斥同步。 C
不需要同步。 A
, B
,和C
被张贴到io_service
。 A
和B
被调用。 线程池现在用尽由于外部同步,因为正在使用两个线程。 不幸的是,其中一个线程被阻塞上的资源,从而导致需要没有同步,诸如处理程序C
,在队列中的坐。
如果一个股被用于同步在这种情况下,那么饥饿的这种情况就不会发生。 甲strand
保持其自己的处理程序的队列,并且可以保证只有其处理程序中的一个是在io_service
,导致处理程序在放入之前被同步io_service
。 在该方案中,如果A
和B
都贴到strand
,那么strand
将发布A
进入io_service
。 这将导致A
与C
在被io_service
,使C
而同时运行B
留在strand
的排队等待A
完成。
此外,存在其中这两种形式的同步可以一起使用的用例。 例如,考虑在资源与所述线程池的线程中运行外共享的情况。 互斥,仍然由线程内部和外部的线程池是必需的。 然而, strand
可以用来除去争用线程内部的线程池之间的互斥。
boost
是简单地调用其观点回调。 这个回调有没有关系, boost
,因此boost
不在乎你在回调做什么。 因此,采取锁(使用任何你想要的锁定库),是完全正常的。
完成处理程序中的互斥可以阻止线程执行。 在这种情况下,你需要更多的io_service
的线程比boost::thread::hardware_concurrency()
来加载CPU为100%。 它增加线程切换的开销。