我有一个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不是线程安全的。我是否必须添加原子锁以避免崩溃?
答案 0 :(得分:5)
您使用锁定不会使您的地图线程安全。两个线程可以读取myLock == 0
并进入你的大括号。
你需要一个互斥锁。 This answer on locking may be useful