如何确保只有一个线程从一个文件执行 IO?

How can I make sure only one thread performs IO from a file?

这是我的用例(使用 C++):我有一个多线程环境,对写在磁盘上的数据结构执行操作。有M个文件。工作流程是:

  1. 线程从文件中读取数据结构
  2. 对数据结构进行操作
  3. 数据结构插入缓存
  4. 最近使用的元素写入文件

缓存插入和删除已经是线程安全的。但是,我不知道如何并行写入和读取,即如果线程 1 从文件 1 读取,则线程 2 可以从文件 2 读取。当然线程 2 不应该从文件 1 读取。如果我只是插入一个互斥锁,整个部分被锁定,同时只有一个线程可以读取。确保只有一个线程从一个文件读取,但同时读取多个文件的最有效方法是什么?

编辑:代码是这样的

for element in elements
    file = element.txt
    data = file.read()
    cache.insert(data)

将文件名放在 std::map 中作为键。然后添加互斥量指针作为值。然后,每当一个线程有一个文件名要处理时,它就会使用互斥锁和锁保护器进行锁定。

{
  lock_guard<mutex> lg (*mapping[filename] );
  compute(filename);
}

由于OS有自己的文件缓存,所以最好使用read-lock让多个线程同时读取一个文件并且仍然通过唯一锁锁定防止写入。