gpt4 book ai didi

c++ - 复制/修改 STL 容器的拷贝是线程安全的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:36 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com