1

2 つの pthread 間で、ロックのないシングル プロデューサー、シングル コンシューマーの循環キューを実装したいと考えています。ARM Linux の C で。

キューはバイトを保持し、プロデューサーは memcpy() を取り込み、コンシューマーはそれらをファイルに write() します。

頭と尾のオフセットを int に格納でき、すべてがうまくいくと考えるのは単純ですか? コンパイラの最適化など、頭/尾の書き込みがレジスタにあり、他のスレッドからは見えないこと、またはどこかにメモリバリアが必要であることなどについて疑問に思っています。

4

1 に答える 1

4

pthreads のメモリ一貫性モデルは、ロックレス アルゴリズムの構築を支援するものではありません。あなたはあなた自身です - あなたのアーキテクチャで提供され、必要とされるアトミックな命令とメモリバリアを使用する必要があります。また、コンパイラ バリアを要求する方法を決定するには、コンパイラのドキュメントを参照する必要があります。

ミューテックスと条件変数によって保護された通常のキューの実装を使用する方がほぼ確実に優れています。キューが、(データ自体ではなく) ファイルに書き出されるバッファへのポインタを格納するだけの場合、ロックの競合は発生しません。ポインターがキューに追加またはキューから削除されている間だけロックを保持する必要があるため、問題があります。

于 2011-06-23T11:40:08.093 に答える