boost interprocess file_lock 不适用于多个进程

Posted

技术标签:

【中文标题】boost interprocess file_lock 不适用于多个进程【英文标题】:boost interprocess file_lock does not work with multiple processes 【发布时间】:2011-07-14 17:51:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

它与文件的文件系统保护无关

Reference

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

它不是文件系统锁。

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

【讨论】:

以上是关于boost interprocess file_lock 不适用于多个进程的主要内容,如果未能解决你的问题,请参考以下文章

boost::interprocess_mutex 与进程本地 boost::mutex

boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁

boost::interprocess::message_queue 权限被拒绝

Boost.interprocess Vector 作为类成员

这些 Boost::Interprocess 组件是不是需要同步?

Boost Interprocess 找不到 boost/config/user.hpp