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

标签 c++ multithreading stl

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

相关文章:

c++ - 尽管包含在 PATH 中,但无法识别 Boost 库文件

c++ - std::sort 函数给出 "Bus error: 10"

multithreading - 更好地解释 TAS Vs。 "The Art Of Multiprocessor Programming"Herlihy & Shavits 上下文中的 TTAS

c# - Webservice - 线程与异步方法调用

java - 异步返回延迟 - IllegalMonitorStateException

c++ - 映射和运算符重载 C++

c++ - 如何从 std::heap 弹出最小元素?

C++ STL 映射 - 条件返回

c++ - 为什么这个程序提示我 'pressy any key to continue' ?

c++ - 为什么 ‘Char’标识符在VS2013中无法识别?