x86 プラットフォーム (Pentium 以上を保証) で 64b アラインされた 64b データのアトミック読み取りを実行したいと考えています。
これを行う方法はありますか?(いいえ、これにはクリティカルセクションやミューテックスを使用したくありません。これをロックフリーにしたいのです)。
このページでは、その方法について説明します。基本的には使うだけlock cmpxchg8b
です。
Interlocked 操作を使用します。サンプル コードは次のとおりです。
LONGLONG AtomicRead(LONGLONG* p)
{
return InterlockedCompareExchange64(p, 0, 0);
}
これは、ゼロに対する比較交換を行い、すでにゼロに等しい場合は p をゼロに設定します。つまり、noop です。InterlockedCompareExchange は、p が指す元の 64 ビット値を返します。
Interlocked*() 関数を使用します。
読み取り自体はありませんが、0 を追加する場所に Add() を発行できます。