boost interprocess file_lock不适用于多个进程

时间:2011-07-14 17:51:18

标签: c++ boost file-io locking interprocess

我似乎遇到了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()会对文件进行独占锁定,并阻止任何其他进程读取/修改文件。

3 个答案:

答案 0 :(得分:9)

file_lock不用于锁定文件。它是一个互斥对象,它使用文件作为其后备技术。文件内容基本无关;相关的是指向该文件的file_lock的所有实例都将遵循锁的锁定特性。

与任何互斥锁类型对象一样,锁本身用于保护或以其他方式计量访问其他资源。

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

Reference

答案 1 :(得分:3)

为了确保可移植性,在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,你的代码将是可移植的。

答案 2 :(得分:0)

它不是文件系统锁。

简单地锁定一个进程不会阻止另一个进程访问该文件。可以把它想象成“互斥体”。要让您的第二个进程尊重file_lock,您还需要在第二个进程中获取锁定。然后你会看到proc2将阻塞,等待proc1释放锁。