4

共有リソースへのアクセスを同期するとき、通常のミューテックス (基本的には単なる書き込みロック) の代わりに読み取り/書き込みロックを使用しない理由はありますか?

言い換えれば、選択した優先同期構造としてロックの読み取り/書き込みをデフォルトにするだけで、自分自身を撃っていますか?

常に読み取り/書き込みロックを選択し、それに応じて読み取りロックと書き込みロックを使用する理由の 1 つは、何らかの同期を実装できることであり、パフォーマンスの向上という利点を得る一方で、同期についてもう一度考える必要はありません。ある日、より競合の多い環境にコードをドロップした場合の将来のスケーラビリティ。したがって、実際のコストなしで潜在的なメリットがあると仮定すると、常に使用することは理にかなっています. それは理にかなっていますか?

これは、実際にはリソースが制限されていないシステム上にあり、おそらくパフォーマンスの問題です。また、私はこの質問を一般的に表現しましたが、問題がある場合は、QtQReadWriteLockQMutex(C++) を特に念頭に置いています。

4

2 に答える 2

2

実際には、読み取り/書き込みロック ペアの書き込みロックは、単純なミューテックスよりも高価です。読み取り/書き込みロックには、ロックを取得または解放するときに適用する必要がある調整戦略が常にあります。特定の実装に応じて、この戦略は安価または高価になる可能性がありますが、常に存在します。

の場合、QReadWriteLockライターを優先するロジックがあります。このようなロジックの実装が効率的で、待機キューにリーダーがいない場合でも、完全に無料になることはありません。

私はQMutexとのQReadWriteLock実装のすべての詳細に精通しているわけではありませんが、ドキュメントによると、QMutex競合しないケース向けに大幅に最適化されています。QReadWriteLockはそのような発言はありません。たぶん、彼らはそのようなメモをするのを忘れただけかもしれませんが、そのような状況でのその動作はQMutex.

最良のシナリオでは、読み取り/書き込みロックを使用することによるペナルティは無視できると思います。しかし、最悪のシナリオでは、1 ナノ秒ごとに戦うと、それが目立つ可能性があります。

于 2016-09-14T18:16:03.060 に答える
1

それは、ロックの混雑の特徴に要約されます。単純なミューテックスのパフォーマンスが大幅に向上するのは、書き込み優先度の高い輻輳です。

これは非常に長く、議論の余地のあるテーマです。Spinlocks と Read-Write LocksSleeping Read-Write Locks を読むことをお勧めします。

于 2016-09-14T18:05:20.647 に答える