メモリ内の 2 つの値のアトミック合計が必要な状況に陥っています。私が継承したコードは次のようになります。
int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
a と b の個々の読み取りはアトミックであり、コード内のこれら 2 つのメモリ位置への書き込みもすべてロックレス アトミックです。ただし、問題は、2 つの場所の値が 2 つの読み取り間で変化する可能性があり、実際に変化することです。
では、この操作をアトミックにするにはどうすればよいでしょうか。私は CAS についてすべて知っていますが、読み取り-変更-書き込み操作をアトミックにすることだけが必要になる傾向があり、それは私がここでやりたいことではありません。
それを行う方法はありますか、またはコードをリファクタリングして、1つの値のみを確認する必要があるようにするための最良のオプションはありますか?
編集: ありがとう、最初のリビジョンでこれをロックレスでやりたいとは言いませんでしたが、2 回目のリビジョンの後でそれを理解した人もいました。こういうことを言う人は誰も信じないのはわかっていますが、実際にロックを使うことはできません。アトミックでミューテックスをエミュレートする必要があり、それはコードをリファクタリングして 2 つではなく 1 つの値を追跡するよりも手間がかかります。
今のところ、私の調査方法は、値が連続しているという事実を利用し、64 ビットの読み取りでアトミックにそれらを取得することです。これは、ターゲット プラットフォームではアトミックであることが保証されています。誰かが新しいアイデアを持っている場合は、貢献してください! ありがとう。