Код: Выделить всё
std::atomic::fetch_add()Из N3337 [atomics.types.operations/30]:
Примечание. Для целочисленных типов со знаком в арифметике используется представление с дополнением до двух. Неопределенных результатов нет. Для типов адресов результатом может быть неопределенный адрес, но в противном случае операции не имеют неопределенного поведения.
Мои вопросы:
(1) Как std::atomic::fetch_add() реализован на платформе, которая использует представление целых чисел со знаком, отличное от дополнения до двух? Существует ли только реализация без блокировки, использующая мьютекс и т. д.?
(2) При чтении значения из атомарной переменной, содержащей отрицательное значение, на платформе, использующей представление метод, отличный от дополнения до двух, преобразуется ли он автоматически в собственный формат платформы? Или пользователь обязан преобразовать его в собственное представление, поскольку из него считывается битовая строка представления с дополнением до двух?
Код: Выделить всё
std::atomic a{0};
a.fetch_sub(1);
int x = a.load(); // The value of a is -1 (0xffffffff), so what is the value of x?
Обратите внимание, что в N2427 по поводу вышеизложенного говорится следующее:
Обычные операции сложения целых чисел со знаком имеют неопределенное поведение в случае переполнения. Для атомарных переменных такое неопределенное поведение создает значительную нагрузку, поскольку, как правило, невозможно выполнить предварительную проверку на переполнение. Вместо того, чтобы оставлять переполнение неопределенным, мы признаем де-факто поведение современных систем и определяем атомарную операцию выборки и сложения (-вычитания) для использования арифметики с дополнением до двух. Нам не известно ни об одной реализации C++, для которой это определение представляло бы проблему.
(Этот вопрос основан на академическом интересе . Я спросил об этом не потому, что мне трудно справиться с какими-либо реальными проблемами.)
Подробнее здесь: https://stackoverflow.com/questions/792 ... mplement-c
Мобильная версия