2 つの質問があります。
- 一般的なケースでは、アトミックを T として使用し、それらを交換可能に切り替えることは安全ですか?
- futex の場合、キャストしても安全ですか?
非アトミック型でアトミック操作を実行することは未定義の動作であることは承知していますが、その逆の答えが見つかりません。たとえば、これは期待どおりにコンパイルおよび実行されます。
std::atomic_int foo = 5;
int* bar = reinterpret_cast<int*>(&foo);
(*bar)++;
std::cout << (*bar) << std::endl;
2 番目の質問については、Linux のマンページで FUTEX_WAIT 操作について説明されています。
futex ワードの値のロードは、アトミック メモリ アクセスです (つまり、それぞれのアーキテクチャのアトミック マシン命令を使用します)。このロード、期待値との比較、およびスリープの開始は、同じ futex ワードに対する他の futex 操作に対してアトミックかつ完全に順序付けられて実行されます。
では、次のコードは安全ですか?
std::atomic_int32_t val = 0;
syscall(SYS_futex, reinterpret_cast<int*>(&val), FUTEX_WAIT_PRIVATE, 0, nullptr);