STM (Software Transactional Memory) 関連のことは何も書いておらず、Web 上の情報を読んだだけです。したがって、これは単なる架空の例です
最大許容アイテムを含む FIFO バッファがあるとします。そのため、最大項目数に達するまで配列を埋め、それ以上項目がなくなったらシフトします。従来のアプローチでは、実際のシフトと追加だけでなく、最大値に達したかどうかをチェックする条件付き読み取りもロックします。そうしないと、2 つのスレッドがシミュレートして、残された唯一のアイテムがそれらに向けられたものであると判断できます。したがって、書き込みの競合とは直接関係のない一種の論理ロックがここにあります。
STM を使用すると、2 つのスレッドがアイテムが残っていると判断し、最後のアイテムを埋めようとすることができると思います。ただし、別のスレッドが同じメモリを変更したことを検出した後、1 つのスレッド (または両方) でロールバックが発生するため、正確性は維持されます。楽観的なシナリオでは、スレッドの 1 つが最終的に要素数を増やし、別のスレッドが最終的に別の分岐に移動する (FIFO シフト) と述べています。しかし、両方が最後のアイテムが残っていることに気づき、それを埋めようとすると、ここで無限ループの可能性も見えます。
では、STM 関連のソフトウェアを作成するときに「論理」ロックを追加する必要はありますか?