我正在开发一个需要 std::map
的程序特别是像这样的 map<string,map<string,int>>
- 它意味着类似于银行更改率 - 第一个字符串是原始货币,第二个 map 中的那个是所需的货币,int 是他们的汇率。整个 map 将只读。我还需要互斥量吗?我对整个线程安全有点困惑,因为这是我的第一个更大的多线程程序。
最佳答案
如果您谈论的是标准 std::map
† 并且没有线程写入它,则不需要同步。没有写入的并发读取没问题。
但是,如果至少有一个线程在映射上执行写操作,您确实需要某种保护,例如互斥量。
请注意 std::map::operator[]
算作写入,因此请使用 std::map::at
(或 std::map::find
如果键可能不存在于 map 中)。您可以通过 const map&
仅引用共享映射,让编译器保护您免受意外写入。
†已在 OP 中明确说明是这种情况。为了完整起见:请注意其他类可能有 mutable
成员。对于那些,即使通过 const&
访问也可能会引入竞争。如果有疑问,请查看文档或使用其他东西进行并行编程。
关于C++线程安全——读图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40874027/