Согласно одному видео E2E канала 9 (с Хербом Саттером) в С++ 0x, если число atomic<int>
number++
является атомарным. Может ли кто-нибудь подтвердить, что так оно и есть в окончательном стандарте С++ 11 (давайте притворимся, что он доработан :)).
Является ли ++ атомарным для std::atomic‹int›
Ответы (2)
Стандарт доработан, и каждая операция над всеми стандартными целочисленными специализациями atomic<T>
является атомарной.
Это не означает, что все выражения, включающие стандартный интеграл atomic<T>
, являются атомарными.
number = number * 2;
это две операции:
temporary = number * 2;
number = temporary;
Каждая из них атомарна, но вместе они не атомарны. Для этого и нужны транзакции/критические разделы.
person
spraff
schedule
27.07.2011
поэтому число = число * 2; и число=число+47; тоже атомные?
- person NoSenseEtAl; 27.07.2011
Каждая операция, определенная для
atomic<T>
, является атомарной, как number *= 2;
и number += 47;
.
- person Bo Persson; 27.07.2011
number=number*2 – это две операции. Каждый из них атомарен, но вместе они не атомарны. Для этого и нужны транзакции.
- person spraff; 28.07.2011
отличный ответ, но не могли бы вы также объяснить, если x=a.load(); такое же, как х=а; //x не является атомарным, a является
- person NoSenseEtAl; 01.08.2011
Они одинаковы только при условии, что они не взаимодействуют ни с какими другими выборками/назначениями. См. пример здесь, на странице 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