由并发无序映射查找线程调用的函数是否安全?

时间:2018-09-13 16:00:52

标签: c++ multithreading visual-studio concurrency thread-safety

假设我有以下代码:

#include<concurrent_unordered_map.h>

struct firstStruct {
<irrelevant code>
}
struct secondStruct {
    void func(){ 
       <CRITICAL CODE>
    }
}

假设我有这个:

concurrent_unordered_map<firstStruct,secondStruct> cmap = ...

,并假设已填充cmap,并且firstStruct fsecondStruct 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),会发生什么?

1 个答案:

答案 0 :(得分:2)

proposalconcurrent_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;

也不是线程安全的,因为当您将新对象分配给键时,该函数仍将运行。