Какие операции над атомарной переменной c ++ 11 на самом деле являются атомарными? - PullRequest
0 голосов
/ 02 июня 2019

Я читаю справочное руководство по cpp на std :: atomic (https://en.cppreference.com/w/cpp/atomic/atomic)), и я не совсем понимаю, какие именно операции выполняются атомарно.

Основные операции, с которыми у меня возникают проблемы:
оператор =, оператор + и оператор + =
Я знаю, что эти операции определены для шаблона, я просто не уверен, если и когда они на самом деле являются атомарными. Буду признателен за помощь в понимании, когда операция с такой переменной является атомарной, а не.

Edit:
Я прочитал вопрос, указанный здесь: Что такое std :: atomic? и я все еще в замешательстве. Например, скажем, что атомный Int. Является ли + = 100 эквивалентом a.fetch_add (100)?
В той же строке вопросов a.load (100) эквивалентно a = 100?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

После просмотра ссылки @ Treebeard https://www.youtube.com/watch?v=ZQFzMfHIxng (смотрите соответствующую информацию минут 13-15)
Любая операция, выполняемая с атомарной переменной, является атомарной.Однако одна и та же строка может содержать более одной операции.
Так, например, с учетом следующего кода:

int a = 1;  
int b=1;   
auto c = std::atomic<int>(0);  
c = a + b;  

последняя строка не является атомарной операцией, поскольку a + b сама по себеatomic, operator = сам по себе атомарный.Однако вместе они составляют 2 операции, которые вместе не являются атомарными.В заключение, я бы рекомендовал использовать явные функции шаблона, такие как load (), fetch_add () и store (), вместо использования стандартных перегруженных операторов, поскольку они могут гарантированно выполняться атомарно.

0 голосов
/ 02 июня 2019

Если в стандарте указано, что операция является атомарной, тогда равно . Это зависит от реализации, чтобы убедиться, что обещание, данное стандартом, выполнено. Если реализация не выполняет обещание, то у вас в руках несоответствующая реализация.

...