This is a link to an MCVE that demonstrates the deadlock

它包含五个部分:


SharedEvent是存储在共享内存中的AutoResetEvent的实现。
CreatedSharedEvent创建一个分配了SharedEvent的命名共享内存对象。它提供了一个访问器方法,该方法返回对SharedEvent的引用。
OpenedSharedEvent将打开已在其中分配SharedEvent的命名共享内存对象。它还提供了一个访问器方法,该方法返回对SharedEvent的引用。
服务器控制台应用程序,它使用CreatedShareEvent创建SharedEvent并每2秒设置一次事件。每次设置事件时都会打印一条消息。
一个控制台应用程序,它使用OpenedShareEvent打开共享事件,并在循环中等待该事件。每当等待调用返回时,它都会打印一条消息。


重现该问题:


运行服务器。观察每2秒打印一次的消息。
运行客户端。观察每2秒打印一次的消息。
关闭客户端。观察服务器停止打印消息。它在interprocess_condition :: notify_one()中被阻止

最佳答案

问题的原因与here中所述的相同:

在进程可能崩溃并仍然保持锁定的情况下,不能使用boost-interprocess。

我将发布一个不同的问题,以查看是否有人发现可以很好地替代boosts condition_variable和interprocess_mutex。

关于c++ - 为什么boost的interprocess_condition死锁在notify_one中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44991510/

10-10 08:34