为什么boost的interprocess_condition在notify_one中死锁?

时间:2017-07-08 23:03:01

标签: c++ boost condition-variable interprocess

This is a link to an MCVE that demonstrates the deadlock

它包含五个部分:

  1. SharedEvent是存储在共享内存中的AutoResetEvent的实现。

  2. CreatedSharedEvent创建一个已分配SharedEvent的命名共享内存对象。它提供了一个访问器方法,该方法返回对SharedEvent的引用。

  3. OpenedSharedEvent打开一个已分配SharedEvent的已命名共享内存对象。它还提供了一个访问器方法,该方法返回对SharedEvent的引用。

  4. 服务器控制台应用程序,它使用CreatedShareEvent创建SharedEvent,并每2秒设置一次事件。每次设置事件时都会打印一条消息。

  5. 使用OpenedShareEvent打开共享事件的控制台应用程序,并在循环中等待事件。每次等待调用返回时都会打印一条消息。

  6. 重现问题:

    1. 运行服务器。观察每2秒打印的信息。

    2. 运行客户端。观察每2秒打印的信息。

    3. 关闭客户端。注意服务器停止打印消息。它在interprocess_condition :: notify_one()

    4. 中被阻止

1 个答案:

答案 0 :(得分:0)

问题的原因与描述here

相同

此进程的使用不能用于进程可能崩溃并仍然保持锁定的情况。

我将发布一个不同的问题,看看是否有人发现了boosts condition_variable和interprocess_mutex的良好替代品。