如何确保只有一个线程从一个文件执行 IO?
How can I make sure only one thread performs IO from a file?
这是我的用例(使用 C++):我有一个多线程环境,对写在磁盘上的数据结构执行操作。有M个文件。工作流程是:
- 线程从文件中读取数据结构
- 对数据结构进行操作
- 数据结构插入缓存
- 最近使用的元素写入文件
缓存插入和删除已经是线程安全的。但是,我不知道如何并行写入和读取,即如果线程 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让多个线程同时读取一个文件并且仍然通过唯一锁锁定防止写入。
这是我的用例(使用 C++):我有一个多线程环境,对写在磁盘上的数据结构执行操作。有M个文件。工作流程是:
- 线程从文件中读取数据结构
- 对数据结构进行操作
- 数据结构插入缓存
- 最近使用的元素写入文件
缓存插入和删除已经是线程安全的。但是,我不知道如何并行写入和读取,即如果线程 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让多个线程同时读取一个文件并且仍然通过唯一锁锁定防止写入。