Какие операции с атомарной переменной c ++ 11 на самом деле атомарны?

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

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

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


person EliT    schedule 02.06.2019    source источник
comment
Если вы нажмете ссылку на странице, на которую вы указали в вопросе, чтобы перейти на страницу операторов, она сообщит вам. Например: en.cppreference.com/w/cpp/atomic/atomic/operator_arith2 < / а>   -  person NathanOliver    schedule 02.06.2019
comment
@NathanOliver Он не говорит прямо, какие из операций являются атомарными, а какие нет.   -  person EliT    schedule 02.06.2019
comment
Возможный дубликат Что такое std :: atomic?   -  person Jelle Bleeker    schedule 02.06.2019
comment
Все операторы, реализованные атомарным ‹T› (как определено в стандарте), являются атомарными. Если оператор не реализован, он не является атомарным (вы все равно не сможете использовать неопределенные операторы)   -  person indeterminately sequenced    schedule 02.06.2019
comment
Самое первое предложение: Атомарно заменяет текущее значение результатом вычисления, включающим предыдущее значение и аргумент. Это операция чтения-изменения-записи.. Насколько больше вы хотите?   -  person NathanOliver    schedule 02.06.2019
comment
Это очень хороший доклад, в котором он перечисляет операторов более четко, чем я могу: youtube.com/watch? v = ZQFzMfHIxng   -  person Treebeard    schedule 03.06.2019


Ответы (2)


После просмотра ссылки @ 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 сама по себе атомарна, оператор = сам по себе атомарен. Однако вместе они составляют 2 операции, которые вместе не являются атомарными. В заключение я бы рекомендовал использовать явные функции шаблона, такие как load (), fetch_add () и store (), вместо использования стандартных перегруженных операторов, поскольку они могут гарантированно выполняться атомарно.

person EliT    schedule 04.06.2019
comment
a+b не является атомарным; это простые int переменные, поэтому их чтение не дает никаких гарантий. Однако они производят значение, которое атомарно сохраняется в c. (По умолчанию memory_order_seq_cst) - person Peter Cordes; 04.06.2019
comment
@PeterCordes С другой стороны, они, вероятно, подразумеваются в том же блоке, поэтому я не понимаю, как другой поток мог их изменить (может быть, может, я не знаю), но я думаю, что пример был упрощением, может быть, плохим пример. - person Lukas Salich; 09.04.2020
comment
@LukasSalich: В этом ответе говорится, что поскольку a + b сам по себе атомарен. Это чепуха, полное искажение того, что этот пример мог бы показать. Однако общий вывод о том, что весь оператор C ++ не является одной атомарной транзакцией, является правильным. - person Peter Cordes; 09.04.2020

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

person Jesper Juhl    schedule 02.06.2019
comment
И не только операция атомарна, но и ее использование не приводит к гонке данных. - person curiousguy; 06.06.2019