是否存在可以存储在 Windows 共享内存中的 condition_variable 和 mutex 的健壮实现?

Posted

技术标签:

【中文标题】是否存在可以存储在 Windows 共享内存中的 condition_variable 和 mutex 的健壮实现?【英文标题】:Is there a robust implementation of condition_variable and mutex that can be stored in shared memory on Windows? 【发布时间】:2017-07-11 22:08:00 【问题描述】:

如this 问题中所述,如果持有互斥锁的进程崩溃,使用 boost 的 interprocess_mutex 和 interproces condition_variable 可能会导致死锁。 这是因为 boost 的互斥锁不是内核对象,因此在持有它的进程退出时不会自动释放。 有没有一种方法可以将进程间条件变量与调用 CreateMutex 返回的互斥锁一起使用?

【问题讨论】:

见***.com/questions/1179685/… 感谢您的指点。一种不处理其中一个进程崩溃的进程间机制?我本来希望从 boost 中得到更好的结果。 TBH 它的应用程序定义了应该是什么行为。除非操作系统支持强大的 IPC 同步机制,我对此表示怀疑。如果确实如此:使用那个... :( 【参考方案1】:

只需直接使用CreateSemaphore() 即可跨多个进程实现condvars。您不需要使用 Boost condvars。 Windows 提供了一组非常丰富的定义良好、相当正确、命名的机器范围同步对象。改用这些。

【讨论】:

实现 condvars 不是一件简单的事情,涉及的不仅仅是调用 CreateSemaphore。 Boost.Thread 的 condvar 实现是在 win32 上使用 win32 信号量实现的,它不像 POSIX 信号量那样被破坏。只需克隆该实现。应该在一小时内完成。 Boost.Interprocess 作者在这里。使用信号量不会解决问题。如果一个进程在使用实现条件变量的信号量时死掉了,其他进程不会注意到它。例外被命名为互斥体,当所有者死亡时可以返回 WAIT_ABANDONED。根据定义,信号量没有所有者,因此如果一个进程正在等待另一个进程发出信号量而信号量终止,则内核不会发出任何通知。

以上是关于是否存在可以存储在 Windows 共享内存中的 condition_variable 和 mutex 的健壮实现?的主要内容,如果未能解决你的问题,请参考以下文章

动态链接库与共享内存:

Windows网络共享上的svn存储库

shiro之redis频繁访问问题

Azure 中的条件存在检查:拒绝策略

是否可以在 Windows 应用商店应用中的用户之间共享数据?

CUDA - 确定共享内存中的银行数量