1

趣味でマルチスレッド コードを書いていると、次のような状況に陥りました。

スレッドは、メモリ プールから単一のリソース ユニットを要求し、それを処理して、このデータへのポインターを別のスレッドに送信し、循環バッファーを使用してさらに操作を行います (1R / 1W の場合)。

後者は、受信したデータの処理が完了するたびに前者のスレッドに通知する必要があるため、メモリを再利用できます。

この「フリーリスト」を別の循環バッファーとして実装し、空きリソースのアドレスを保持するか、ロックフリースタックの方法 (x86-64 で DCAS を実装する) を選択する方がパフォーマンス的に優れているかどうか疑問に思います。

一般的に言えば、2 つの異なるアプローチの長所と短所は何でしょうか?

4

2 に答える 2

1

主な違いは、循環バッファーは制限されますが、スタックは制限されないことです。

このようなことについて、テストを行わずにパフォーマンスの判断を下すのは困難です。一方では、循環バッファーは連続した配列によって支えられています。リーダーとライターのインデックスが互いに「近い」ままである場合、各スレッドが常に共有キャッシュ ラインを無効にすることになります。

一方、スタックを使用すると、スタックのトップ ポインターの競合が発生する可能性があり、その結果、スレッドが CAS ループでスピンすることがあります。

私の推測では、最良の選択はワークロードに依存するということです。

于 2012-07-03T00:49:31.920 に答える
1

念のため、ロックフリーとウェイトフリーには違いがあります。前者はロックがないことを意味しますが、スレッドはまだビジースピンして進行していない可能性があります。後者は、ロックやビジースピンなしでスレッドが常に進行することを意味します。

1 つのリーダーと 1 つのライターを使用すると、ロックフリーでウェイトフリーの FIFO 循環バッファーを簡単に実装できます。

LIFOスタックもウェイトフリーにできると聞いていますが、FIFOリストについてはよくわかりません。そして、スタックではなくキューが必要なようです。

于 2011-10-25T14:34:13.673 に答える