3

問題は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);

data128 ビット 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 実装の癖だと思います。

ありがとうございました

4

1 に答える 1