#c #atomic #c 20
#c #атомарный #c 20
Вопрос:
По этой ссылке
Атомарно сравнивает представление объекта (до C 20) представление значения (начиная с C 20) *this с представлением ожидаемого, и если они побитово равны, заменяет первое на желаемое (выполняет операцию чтения-изменения-записи). В противном случае загружает фактическое значение, сохраненное в *this, в ожидаемое (выполняет операцию загрузки).
Следовательно, при использовании C 20
, while
цикл в следующем коде должен быть бесконечным, но он конечен. Я ошибаюсь или что происходит
#include <atomic>
#include <iostream>
struct S {
char a{};
int b{};
};
bool operator==(const Samp; lhs, const Samp; rhs) {
return lhs.a == rhs.a amp;amp; lhs.b == rhs.b;
}
int main() {
S expected{ 'a', 2 };
std::atomic<S> atomicS{ S{'a', 2} };
reinterpret_cast<unsigned char*>(amp;(atomicS))[1] = 'e';
reinterpret_cast<unsigned char*>(amp;(expected))[1] = 'f';
while (atomicS.compare_exchange_strong(expected, S{ 'a',2 }));
std::cout << "nfinished";
}
Ответ №1:
Это изменение (для использования представления значений вместо представления объектов) было сделано как часть P0528R3 (мотивацию и историю можно найти в P0528R0). Как вы можете видеть в разделе поддержка компилятора cppreference, ни gcc, ни clang пока не реализуют эту функцию. MSVC делает это в 19.28, но это недоступно в compiler Explorer, поэтому я не могу проверить это на данный момент.
Итак, на данный момент вы эффективно проверяете старое поведение.