私はintを読み込むだけのスレッドAとインクリメントするスレッドBを持っています。同期なしで同時にインクリメントされているintを読み出すことは安全ですか?
スレッドAを値の正確な最新情報にする必要はありません。実際には9になると8になります。ループであり、ある時点で9になるので大丈夫です。
問題は、現在のインデックス(スレッドAによって最後に読み込まれた位置)と配列の「サイズ」が格納されている別のintを格納する固定サイズの配列です。両方のint値が0から開始され、更新スレッドAは、サイズintがインデックスintより大きいかどうかを調べます。そうであれば、それはキャッチアップして新しい値を読み取ります。
正確な精度が必要ないため、同期を回避できるかどうかを知りたいと思います。
同期を行わないと結果が指定されません。実際には、私はあなたがこの場合には8または9を得ると期待しています。しかしそれは何でもよい。その結果、C++仕様には、42、-17、または真空中の光の速度を得ることを禁止するものは何もありません。結果は何でもよい。 –
もっと実用的には、intがレジスタの少なくとも1つに格納されていればどうなるか考えてください。あなたは絶対に安全であるために必要な数の同期から始め、それがボトルネックであると確信している場合にのみ微調整してください。 – eran
あなたは間違いなく同期を避けることはできませんが、std :: atomicを使うことができます。これは増分が非常に高速です。フードの下には、非常に高速なCPUレベルのアトミック操作である[https://en.wikipedia.org/wiki/Fetch-and-add](fetch/add)の形式があります。 –
qexyn