問題は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()
true を返します。これは、シングル スレッド方式でテストされます。cas_result
は常に偽であり、cmp_results
常に真です。
コンパイルは Intel の C++ コンパイラ、バージョン 16 update 2 で行われます。Linux では、libstdc++ バージョン 5.3.1。64 ビット バイナリ。
同じ ICC16 を使用して 32 ビット コードとして Windows でコンパイルした場合、まったく同じコードが正しく動作していました。これは、stdlib 実装の癖だと思います。
ありがとうございました