【发布时间】:2018-04-07 08:00:13
【问题描述】:
我正在尝试确定以下示例代码是否是线程安全的:
std::map<K, V> myMap;
void foo() {
myMap[k]; // Construct a new key-value pair with key `k`.
}
void bar() {
auto it = myMap.find(x);
if (it != myMap.end()) {
std::lock_gaurd<std::mutex> lg(...);
// do something with *it
}
}
没有发生删除(至少在程序终止之前),唯一的操作是在foo 中添加元素并在bar 中迭代它们。函数foo 将在一个线程中调用,bar 将在多个线程中同时调用。
现在,我了解到 STL 容器不是线程安全的,我正在使用 myMap::operator[] 同时执行非常量操作。我感到困惑的是,因为 STL find 不会更改底层映射,并且因为 myMap::operator[] 不会使迭代器或引用无效,所以这仍然被认为是不安全的吗?我的想法有点冲突:我应该担心因为operator[] 是非常量,因此我正在对数据结构进行并发更改,还是我可以认为这是安全的,因为它不会使我的迭代器失效?
【问题讨论】:
-
不变量在调用非常量函数之前和之后都有效,但不保证在运行期间都有效。
标签: c++ multithreading stl