Безопасны ли функции, вызываемые одновременно неупорядоченным потоком поиска карты? - PullRequest
0 голосов
/ 13 сентября 2018

Предположим, у меня есть следующий код:

#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 - это (key,value) пара (f,s), существующая в cmap.

Если бы я использовал следующий фрагмент кода

cmap[f].func();

Было бы выполнение <CRITICAL CODE> в func() из secondStruct s поточно-ориентированным?

Кроме того, что бы произошло, если бы у меня были следующие фрагменты кода, потенциально выполняемые одновременно в разных потоках?

cmap[f].func();

и

SecondStruct s2 = ... ;
cmap[f] = s2;

Если пара (key,value)(f,s) был изменен на (f,s2) одним потоком, что произойдет, если другой поток выполнит <CRITICAL CODE>?

1 Ответ

0 голосов
/ 13 сентября 2018

Из предложения для 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!= 

при условии, что требуемые операции над типом ключа (и mapped_type, если применимо) безопасны для параллелизма.

акцент шахты

Итак, operartor[] потокобезопасен, но операция, которую вы выполняете с его возвращаемым значением, также должна быть поточно-безопаснойгарантировать, что гонка данных не произойдет.Это означает, что <CRITICAL CODE> в func() должен быть сам по себе потокобезопасным.Если это не так, то что-то вроде

cmap[f].func();
SecondStruct s2 = ... ;
cmap[f] = s2;

также не будет потокобезопасным, так как функция все еще будет работать, пока вы назначаете новый объект для клавиши.

...