Сравнивает ли использование compre_exchange с c 20 представления значений? (почему этот пример не соответствует)

#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, поэтому я не могу проверить это на данный момент.

Итак, на данный момент вы эффективно проверяете старое поведение.