假设我有以下代码:
#include<concurrent_unordered_map.h>
struct firstStruct {
<irrelevant code>
}
struct secondStruct {
void func(){
<CRITICAL CODE>
}
}
假设我有这个:
concurrent_unordered_map<firstStruct,secondStruct> cmap = ...
,并假设已填充cmap
,并且firstStruct f
和secondStruct s
是{{1}中存在的(key,value)
对(f,s)
}。
如果我要使用以下代码段
cmap
在cmap[f].func();
的{{1}}中执行<CRITICAL CODE>
是线程安全的吗?
另外,如果我有以下代码片段(可能同时在不同的线程中执行),会发生什么?
func()
和
secondStruct s
如果cmap[f].func();
对SecondStruct s2 = ... ;
cmap[f] = s2;
被一个线程更改为(key,value)
,如果另一个线程恰巧正在执行(f,s)
,会发生什么?
答案 0 :(得分:2)
从proposal到concurrent_unordered_map
对于序列化执行,操作的行为与其当前的STL对等行为相同。唯一的变化是并发津贴。在并发无序容器上并发执行以下任何操作不会引入数据争用:
get_allocator empty, size, max_size begin, end, cbegin, cend insert find, count, equal_range, operator[], at load_factor max_load_factor() operator==, operator!=
假定对键类型(如果适用,则为mapd_type)的必要操作是并发安全的。
强调我的
因此,operartor[]
是线程安全的,但是您对它的返回值进行的操作也必须是线程安全的,以确保不会发生数据争用。这意味着<CRITICAL CODE>
中的func()
本身必须是线程安全的。如果不是,那么类似
cmap[f].func();
SecondStruct s2 = ... ;
cmap[f] = s2;
也不是线程安全的,因为当您将新对象分配给键时,该函数仍将运行。