Как std::atomic реализуется на платформах, которые не используют дополнение до двух? (С++ 14.11.17)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как std::atomic реализуется на платформах, которые не используют дополнение до двух? (С++ 14.11.17)

Сообщение Anonymous »

Код: Выделить всё

std::atomic::fetch_add()
(илиatomic_fetch_add() в C11) основан на дополнении до двух для операций над целыми числами со знаком. Это соглашение отличается от обычной арифметики целых чисел со знаком, в которой допускаются другие схемы представления.
Из 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?
(3) Мне хотелось бы узнать примеры реализации std::atomic::fetch_add() (илиatomic_fetch_add()) на платформах, которые принимают схема представления, отличная от двух дополнений. (Не удивлюсь, если такой платформы на самом деле не существует!)
Обратите внимание, что в N2427 по поводу вышеизложенного говорится следующее:
Обычные операции сложения целых чисел со знаком имеют неопределенное поведение в случае переполнения. Для атомарных переменных такое неопределенное поведение создает значительную нагрузку, поскольку, как правило, невозможно выполнить предварительную проверку на переполнение. Вместо того, чтобы оставлять переполнение неопределенным, мы признаем де-факто поведение современных систем и определяем атомарную операцию выборки и сложения (-вычитания) для использования арифметики с дополнением до двух. Нам не известно ни об одной реализации C++, для которой это определение представляло бы проблему.

(Этот вопрос основан на академическом интересе . Я спросил об этом не потому, что мне трудно справиться с какими-либо реальными проблемами.)

Подробнее здесь: https://stackoverflow.com/questions/792 ... mplement-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»