我有一个 std::map
将被多线程修改,我有一个互斥锁来锁定这些写入。但是,在长时间运行的操作中必须偶尔使用映射,在整个操作期间都持有锁并阻塞所有这些写入是不好的。
我有两个问题:
- 在其他线程正在写入原始 map 的同时对 map 的拷贝执行该操作是否线程安全?
- 在其他线程改变映射时复制映射是线程安全的吗?
例如:
class Foo {
void writeToMap(Bar &bar, Baz &baz) {
// lock mutex
map[bar] = baz;
// unlock mutex
}
std::map<Bar, Baz> getMapCopy() {
// lock mutex (Is this necessary?)
std::map<Bar, Baz> copy (map);
// unlock mutex
return copy;
}
std::map<Bar, Baz> map;
};
void expensiveOperation(Foo &f) {
std::map<Bar, Baz> mapCopy = f.getMapCopy();
// Can I safely read mapCopy?
}
最佳答案
听起来复制操作本身不是线程安全的,问题在于复制 64 位值的原子性。您复制了前 4 个字节,而后 4 个字节正在被另一个线程修改,留下不一致的 8 个字节。
请看这里:Is copy thread-safe?
但是,如果您设法创建一个一致的拷贝,我不明白为什么不......
关于c++ - 复制/修改 STL 容器的拷贝是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25332105/