用于共享内存一致性的锁定机制

sco*_*man 9 c linux posix locking shared-memory

我正在开发一种机制,用于在Linux上使用共享内存在两个或多个进程之间交换数据.问题是需要一定程度的并发控制来维护共享内存本身的数据完整性,而且由于我的某些时刻我的进程可能被杀死/崩溃,常见的锁机制不起作用,因为它们可能会留下内存处于"锁定"状态并在死亡后立即使其他进程挂起等待锁被释放.

因此,做了一些研究我发现System V信号量有一个名为SEM_UNDO的标志,它可以在程序失败时恢复锁定状态,但这并不能保证工作.另一种选择是从可能使用共享内存的所有进程监视PID,并在发生了令人讨厌的事情时对它们进行一些控制,但我不确定这是否是解决我的问题的正确方法.

有任何想法吗??:)

编辑:为了便于说明,我们的应用程序需要某种具有最小延迟的IPC机制.所以,我对可以处理这个要求的机制持开放态度.

Duc*_*uck 1

我很想知道您使用的来源是什么说 SEM_UNDO 不能保证工作。我以前没听说过。我似乎记得读过一些文章,声称 linux 的 SYSV IPC 通常存在 bug,但那是很久以前的事了。我想知道你的信息是否只是过去的产物。

另一件需要考虑的事情(如果我没记错的话)是 SYSV 信号量能够告诉您执行信号量操作的最后一个进程的 PID。如果挂起,您应该能够查询持有锁的进程是否仍然存在。由于任何进程(不仅仅是持有锁的进程)都可以摆弄信号量,因此您可以通过这种方式进行控制。

最后,我将介绍消息队列。它们可能不适合您的速度要求,但它们通常不会比共享内存慢多少。本质上,他们正在做你必须用 SM 手动做的所有事情,但操作系统会在幕后完成这一切。通过同步、原子性、易用性以及经过全面测试的免费机制,您可以获得几乎相同的速度。