0

再びロックフリーについて何か...

単純な配列ベースの整数の循環 FIFO を実装するとします。FIFO は、2 つのスレッドのシングル プロデューサー、シングル コンシューマーによってアクセスされます。読み取りインデックスと書き込みインデックスは、アイテムがアクセスされた後に常に更新されます。単一の CPU では、インデックスへの書き込みアクセス権を持つスレッドは 1 つだけなので、これは安全です (インデックスの更新操作がアトミックであると仮定します)。SMP マシンでは、キャッシュと再配列のために両方の CPU がインデックスの異なる表現を参照する可能性があるため、問題が発生する可能性があります。

QTには、メモリフェンスも実装するクロスプラットフォームのアトミック変数があります.QAtomicIntを使用すると、FIFO実装SMPが安全になりますか、それとも何かを見落としていますか?

4

1 に答える 1

1

実装の残りの部分が健全であれば、安全です。

おっしゃったように、QAtomicInt は命令の並べ替えを防ぐメモリ フェンスを実装しており、これによりプロセッサ間のキャッシュ コヒーレンスも強制されます (実際、x86 および x86_64 プロセッサのキャッシュはすべてコヒーレントですが、コヒーレンス プロトコルはパイプライン ストールを引き起こし、パフォーマンスを低下させる可能性があります。あなたはタイトなループでそれに依存しています)。

于 2013-02-20T22:23:07.320 に答える