Posix名为lock inter process与多线程应用程序有什么用?

时间:2017-07-20 15:18:11

标签: c linux multithreading posix ipc

我需要创建一个可以在Linux多线程应用程序中正常工作的命名锁。每个应用程序实例都可以使用多个具有不同名称的命名锁。

我知道fcntl / flock,但如果尝试从一个应用程序的不同线程或一个线程锁定两次,它就不起作用。

我知道open(..., O_CREATE | O_EXCL),但是如果应用程序被信号KILL杀死或者因为分段错误而崩溃,并且在重新启动应用程序后需要手动删除锁文件,则不会删除此文件锁。

还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

如果您只需要在现代Linux下运行,则可以使用file-private locks。如果这不是一个选项,那么你必须在fcntl锁之上构建自己的线程安全锁定抽象。 SQLite是公共领域并已实现,因此您可以查看它以获取灵感。如果GPL代码没问题:OpenJDK还有另一个不兼容的实现。

O_EXCL不执行锁定(超出文件创建步骤),因此通常没有帮助。

其他选项是System V和POSIX信号量,但这些选项通常在处理日时不能与fcntl锁定一样好。文件映射中的一个强大的,进程共享的互斥锁也可以是一个选项,但是就序列化到磁盘而言,你需要小心保持在POSIX语义内(基本上,你需要每次重新初始化互斥锁)应用程序在重新启动或libc更新后从头开始。)