【问题标题】:Looking for the best boost file lock mechanism for writers - readers为作者-读者寻找最佳的boost文件锁定机制
【发布时间】:2016-03-30 05:54:21
【问题描述】:

我的文件位于不同的目录中,如下所示:

\201603\30
           file_1
           file_2
\201603\31
           file_3
           file_4
           file_5

有 2 个 writer 和 2 个 reader,他们都是我程序中的线程。

锁定将应用于目录而不是单个文件(例如 \201603\30 或 \201603\31)。

我想使用 boost 库来使我的程序可移植。

我已搜索并被介绍给boost::interprocess::file_lock。我只是想知道我是否真的需要一个“进程间”锁,并且该锁可以在读者之间共享吗?除了boost::interprocess::file_lock,你还有什么建议吗?

【问题讨论】:

    标签: c++ boost file-locking


    【解决方案1】:

    由于所有锁定用户都在您的程序中,您需要进程间锁定做什么? file_lock 将互斥锁放入一个文件中,让内核管理锁定/解锁。这仅在多个进程需要遵守锁时才有用。

    听起来你只需要一个普通的读写锁,Boost 称之为shared_lock。有关如何使用的示例,请参阅此答案:https://stackoverflow.com/a/989816/321772

    总而言之,共享锁允许多个线程获取读取锁,但只允许一个线程将锁升级为写入器(排除所有其他读取器/写入器)。

    【讨论】:

    • 我已经知道并且一直在我的程序中使用shared_mutex,但用于其他目的。但是,对于这个问题,我想锁定目录。这意味着,比如说,作者正在写信给\201603\30\file_1,读者仍然可以读取\201603\31\* 中的数据。如何将目录与shared_mutex 匹配?
    • @duong_dajgia 我认为您需要 2 个 rw 锁,一个在 2016\03\30 上,另一个在 2016\03\31 上。在您的任何线程访问目录之前,它应该获取相关的 rw-lock。例如,T1 想访问 2016\03\30\1.txt,它应该尝试获取目录 2016\03\30 上的 rw-lock。实际上,锁定目录或文件并没有什么不同。
    • @DAG 听起来不是一个好的解决方案。目录是在运行时创建的。
    • 然后每个目录有一个锁。哎呀,像“锁定目录”这样的措辞意味着您没有想到比基本互斥锁更复杂的东西。如果您的问题是如何跟踪这些锁,我可以建议unordered_map<string, mutex>
    • @duong_dajgia 查看 Adam 的解决方案。
    【解决方案2】:

    正如另一位响应者所提到的,因为只有一个进程正在使用您不需要锁定在文件系统上的文件,所以 std::shared_mutex 甚至是普通的旧 std::mutex 应该足够了。

    但是,如果您需要跨多个进程有效锁定,并且现在是 2017 年或更晚,您可以考虑在提议的 Boost.AFIO v2 的同行评审后重写中使用 shared_fs_mutex 算法之一:https://ned14.github.io/boost.afio/namespaceboost_1_1afio_1_1v2_1_1algorithm_1_1shared__fs__mutex.html .我警告说是 2017 年的原因是 AFIO v2 甚至还没有测试套件,它是高度 alpha 代码,我不建议任何人使用它。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多