c++ - 为什么boost的interprocess_condition死锁在notify_one?

标签 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 打开共享事件并在循环中等待事件。每次 wait 调用返回时,它都会打印一条消息。

重现问题:

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

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

  3. 关闭客户端。观察服务器停止打印消息。它被阻塞在 interprocess_condition::notify_one()

最佳答案

问题原因与描述的一样here :

这种 boost 进程间的使用不能用于进程可能崩溃但仍持有锁的情况。

我会发布一个不同的问题,看看是否有人发现了一个很好的替代 boosts condition_variable 和 interprocess_mutex 的方法。

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

相关文章:

c++ - 使用单个条件变量暂停多个线程

java - 与 jnpout32pkg/jnpout32reg 的并口通信

java - JNA 从 DLL 调用 C++ 对象 - java.lang.IllegalArgumentException : Structure class has unknown or zero size

c++ - 使用什么 API 来了解使用 C++ 的 pocket pc 2003 环境中的卷状态?

c++ - 如何 spsc_queue.pop() 这个结构?

c++ - 如何正确使用BOOST_THROW_EXCEPTION?

c++ - boost 正则表达式不匹配标签

java - 如何使用 JNI 将字段从 C++ 设置为 Java

C++11 线程安全队列

c++ - boost::condition::timed_wait 的使用示例