Проблема заключается в том, что compare_exchange_strong
возвращает false, несмотря на то, что базовые данные равны expected
. например.:
std::atomic<data> ptr;
...
auto ptr_data = ptr.load();
bool cmp_result = memcmp(&ptr_data, &expected, sizeof(ptr_data));
bool cas_result = ptr.compare_exchange_strong(expected, desired);
assert(cas_result || !cmp_result);
data
— это 128-битный POD. ptr.is_lock_free()
возвращает истину. Это тестируется в однопоточном режиме. cas_result
всегда ложно, cmp_results
всегда верно.
Компиляция выполняется с помощью компилятора Intel C++, версия 16, обновление 2. В Linux используется libstdc++ версии 5.3.1. 64-битный двоичный файл.
Точно такой же код правильно работал при компиляции в Windows, с тем же ICC16, но как 32-битный код. Это заставляет меня поверить, что это причуда реализации stdlib.
Спасибо
__atomic_compare_exchange
, поэтому я сомневаюсь, что это проблема библиотеки. - person T.C.   schedule 21.02.2016memcmp
неправильно - аргументы уже являются указателями на сравниваемые данные, почему вы передаете их как указатели на указатели? - person David Haim   schedule 06.07.2020