Boost进程间file_lock不能用于多个进程

boost interprocess file_lock does not work with multiple processes

本文关键字:进程 用于 不能 file Boost lock      更新时间:2023-10-16

我似乎有一个问题与boost::interprocess::file_lock

进程1实际上是

    boost::interprocess::file_lock test_lock("testfile.csv");
    test_lock.lock();
    sleep(1000);
    test_lock.unlock();

当我在第一个进程处于睡眠状态时运行第二个进程时,我发现我仍然能够读取testfile.csv。更糟糕的是,我甚至可以覆盖它。

我是否误解了file_lock的工作原理?在我的印象中,调用.lock()给了它对文件的独占锁,并阻止任何其他进程读取/修改文件。

file_lock不是用来锁定文件的。它是一个互斥对象,使用文件作为其支持技术。文件的内容基本上是不相关的;相关的是,指向该文件的file_lock的所有实例将尊重该锁的锁定特征。

与任何互斥类型的对象一样,锁本身是用来保护或测量对其他资源的访问的。

与文件的文件系统保护没有关系。

参考

为了确保可移植性,boost中不存在您期望的那种锁。在boost支持的Unix/Linux/OSX操作系统上没有内核级别的强制锁。

:

http://www.boost.org/doc/libs/1_51_0/doc/html/interprocess/synchronization_mechanisms.html interprocess.synchronization_mechanisms.file_lock

因此,boost进程间锁是一个建议或合作锁。您可以使用boost::interprocess::file_lock来完成您想要做的事情,但是,您还必须在其他可能尝试读/写文件的进程中使用interprocess::file_lock。只需在访问文件之前尝试在其他进程中获取锁即可。

这就是interprocess::file_lock的使用方式。如果你在某些操作系统上,你可以用一些特定于操作系统的方法来强制内核级锁定,但是如果你使用boost::interprocess::file_lock,你的代码将是可移植的。

这不是文件系统锁。

简单地锁定一个进程并不能阻止另一个进程访问该文件。可以把它想象成一个互斥锁。要使第二个进程执行file_lock,还需要在第二个进程中获取该锁。然后您将看到proc2将阻塞,等待proc1释放锁。