我需要创建一个可以在Linux多线程应用程序中正常工作的命名锁。每个应用程序实例都可以使用多个具有不同名称的命名锁。
我知道fcntl
/ flock
,但如果尝试从一个应用程序的不同线程或一个线程锁定两次,它就不起作用。
我知道open(..., O_CREATE | O_EXCL)
,但是如果应用程序被信号KILL杀死或者因为分段错误而崩溃,并且在重新启动应用程序后需要手动删除锁文件,则不会删除此文件锁。
还有其他办法吗?
答案 0 :(得分:0)
如果您只需要在现代Linux下运行,则可以使用file-private locks。如果这不是一个选项,那么你必须在fcntl
锁之上构建自己的线程安全锁定抽象。 SQLite是公共领域并已实现,因此您可以查看它以获取灵感。如果GPL代码没问题:OpenJDK还有另一个不兼容的实现。
O_EXCL
不执行锁定(超出文件创建步骤),因此通常没有帮助。
其他选项是System V和POSIX信号量,但这些选项通常在处理日时不能与fcntl
锁定一样好。文件映射中的一个强大的,进程共享的互斥锁也可以是一个选项,但是就序列化到磁盘而言,你需要小心保持在POSIX语义内(基本上,你需要每次重新初始化互斥锁)应用程序在重新启动或libc更新后从头开始。)