我需要创建一个名为lock的锁,它可以正确地与多线程Linux应用程序一起工作。应用程序的每个实例可以使用多个具有不同名称的命名锁。
我知道fcntl/flock,但如果尝试从一个应用程序的不同线程或从一个线程锁定两次,则不起作用。
我知道open(..., O_CREATE | O_EXCL),但如果应用程序被信号杀死或由于分段错误而崩溃,则不会删除此文件锁,并且在重新启动应用程序后需要手动删除锁文件。
还有别的办法吗?

最佳答案

如果您只需要在现代Linux下运行,那么可以使用file-private locks。如果这不是一个选项,那么您必须在fcntl锁之上构建自己的线程安全锁抽象。SQLite是公共领域,并且已经实现了它,所以您可以从中获得灵感。如果GPLed代码没问题:OpenJDK有另一个不兼容的实现。
O_EXCL不执行锁定(超出文件创建步骤),因此这通常没有帮助。
其他选项是System V和POSIX信号量,但它们通常不能在处理日时起到fcntl锁定的作用。文件映射中健壮的进程共享互斥体也可以是一个选项,但就到磁盘的序列化而言,您需要注意保持在POSIX语义范围内(基本上,每次应用程序重新启动或libc更新后重新初始化互斥体)。

关于c - Posix命名的锁间进程与多线程应用程序一起工作是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45218882/

10-10 22:33
查看更多