2

共有データ構造にアクセスする必要がある複数のスレッドを持つ C++ で CPU 集中型プログラムを作成しているため、ロックが必要になります。スループットを最大化するために、ボトルネックを最小限に抑えたいと考えています。おそらく 10 分の 9 はデータ構造を読み取るだけで済み、10 分の 1 はそれを変更する必要があるようです。

書き込みロックがすべてをブロックするが、読み取りロックが互いにブロックしないように、スレッドに読み取りまたは書き込みロックを取得させる方法はありますか?

移植可能なソリューションが理想的ですが、Windows 用のソリューションと Linux 用の別のソリューションがあれば問題ありません。

4

1 に答える 1

4

はい、これはリーダーライター ロックで解決できる一般的な状況です。

プログラムの動的プロパティによっては、ライターの飢餓に注意する必要がある場合があることに注意してください。読み取り試行が常に重複する (または長時間重複する) 十分な数のリーダーが存在する場合、リーダー/ライター ロックの単純な実装は、読み取りを行うリーダーがなくなるまでライターを待機させることで、ライターを「枯渇」させます。より高度な実装では、ライターの要求は概念的に後続のリーダーの前にキューに挿入され、以前にアクティブだったすべてのリーダーが終了した後にライターがアクセスできるようになります。

ほとんどの実装では、読み取りロックまたは書き込みロックが必要かどうかを事前に知る必要があります。一部の実装では、最初に読み取りロックを解放する必要なく、読み取りロックを書き込みロックに「アップグレード」できます (これにより、別のライターがロックに入る機会が得られます)。

于 2012-08-31T02:20:31.983 に答える