Является ли ++ атомарным для std::atomic‹int›

Согласно одному видео E2E канала 9 (с Хербом Саттером) в С++ 0x, если число atomic<int> number++ является атомарным. Может ли кто-нибудь подтвердить, что так оно и есть в окончательном стандарте С++ 11 (давайте притворимся, что он доработан :)).


person NoSenseEtAl    schedule 27.07.2011    source источник


Ответы (2)


Стандарт доработан, и каждая операция над всеми стандартными целочисленными специализациями atomic<T> является атомарной.

Это не означает, что все выражения, включающие стандартный интеграл atomic<T>, являются атомарными.

number = number * 2;

это две операции:

temporary = number * 2;
number = temporary;

Каждая из них атомарна, но вместе они не атомарны. Для этого и нужны транзакции/критические разделы.

person spraff    schedule 27.07.2011
comment
поэтому число = число * 2; и число=число+47; тоже атомные? - person NoSenseEtAl; 27.07.2011
comment
Каждая операция, определенная для atomic<T>, является атомарной, как number *= 2; и number += 47;. - person Bo Persson; 27.07.2011
comment
number=number*2 – это две операции. Каждый из них атомарен, но вместе они не атомарны. Для этого и нужны транзакции. - person spraff; 28.07.2011
comment
отличный ответ, но не могли бы вы также объяснить, если x=a.load(); такое же, как х=а; //x не является атомарным, a является - person NoSenseEtAl; 01.08.2011
comment
Они одинаковы только при условии, что они не взаимодействуют ни с какими другими выборками/назначениями. См. пример здесь, на странице 4. - person spraff; 01.08.2011

Да. atomic<int> operator++ использует atomic<int>::fetch_add, которая является атомарной операцией.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf с. 1127

person τεκ    schedule 27.07.2011