我似乎遇到了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()会对文件进行独占锁定,并阻止任何其他进程读取/修改文件。
答案 0 :(得分:9)
file_lock不用于锁定文件。它是一个互斥对象,它使用文件作为其后备技术。文件内容基本无关;相关的是指向该文件的file_lock的所有实例都将遵循锁的锁定特性。
与任何互斥锁类型对象一样,锁本身用于保护或以其他方式计量访问其他资源。
nothing 与文件的文件系统保护有关。
答案 1 :(得分:3)
为了确保可移植性,在boost中不存在您期望的那种锁。在Unix / Linux / OSX操作系统上没有内核级可强制执行的锁定可以提升支持。
请参阅:
因此,boost进程间锁定是一种建议或协作锁定。您可以使用boost :: interprocess :: file_lock完成您要执行的操作,但是,您还必须在可能尝试读取/写入文件的其他进程中使用interprocess :: file_lock。在访问文件之前,只需尝试获取其他进程中的锁。
这是设计使用interprocess :: file_lock的方式。你可以使用一些特定于操作系统的方法来强制执行内核级锁定(如果你在某些操作系统上),但是如果使用boost :: interprocess :: file_lock,你的代码将是可移植的。
答案 2 :(得分:0)
它不是文件系统锁。
简单地锁定一个进程不会阻止另一个进程访问该文件。可以把它想象成“互斥体”。要让您的第二个进程尊重file_lock,您还需要在第二个进程中获取锁定。然后你会看到proc2将阻塞,等待proc1释放锁。