从std :: map读取没有写入的原子标志

时间:2018-02-20 22:20:25

标签: c++

我有一个std :: map myMap和一个std :: atomic myLock

写作是:

if(myLock == 0)
{
   myLock++;
   myMap.insert(key, value);
   myLock--;
}

如果我在没有从另一个线程锁定的情况下执行此类操作,这是否被视为未定义的行为?关键是,我不介意结果是否不准确(即迭代过后我更新的地图中的值)。我只是不想崩溃。

MyConstIterator endIt = mMap.cend();
for(MyConstIterator it = myMap.cbegin(); it != endIt; ++it)
{ 
}

我试图在没有互斥锁的情况下实现锁定更少的读取,但我知道std :: map不是线程安全的。我是否必须添加原子锁以避免崩溃?

1 个答案:

答案 0 :(得分:5)

您使用锁定不会使您的地图线程安全。两个线程可以读取myLock == 0并进入你的大括号。

你需要一个互斥锁。 This answer on locking may be useful