問題タブ [rwlock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - ライター優先のリーダー/ライター ロックはいつ使用されますか?
多くの読者に好まれる rwlock があることを私は知っています。通常、読者に好まれると考えられている RCU などのさらに積極的な設計もあります。
しかし、書き手が読み手よりもはるかに少なくない場合はどうなるでしょうか? ライターのみの rwlock が排他ロックにフォールバックすることはわかっていますが、次のパターンを検討してください。
- ライターがほとんどですが、読者もいます。おそらく、80% W 対 20% R?
- ライターとリーダーは偶数、50% W 対 50% R
- リーダーが最も多いですが、ライターは無視できず、待ち時間に関する要件があります。20% W 対 80% R
2つの質問があります
- そのようなケース、特に最初の 2 つのケースは本当に存在しますか? これらのタイプに適合するユーザーレベルのアプリケーションは知りません。ユーザーレベルの例が優先されます。
- タイプ 1/2/3 に該当するアプリケーションが実際にある場合、ロックのパフォーマンスを向上させる既存の方法はありますか?
c - Linuxカーネルでrwlockがseqlockよりも人気があるのはなぜですか?
Robert Love の LKD を読んだ後、rwlock と seqlock を学びました。どちらもスピンロックに基づいています。
リーダーとライターを区別すると、rwlock が spinlock よりも優れているため、パフォーマンスが向上します。ただし、rwlock を使用すると、ライターが空腹になります。
seqlock は rwlock がライタ ハングリーの問題を引き起こしている問題を解決しますが、rwlock よりも seqlock の使用が少なくなります。では、なぜ rwlock が seqlock よりも人気があるのでしょうか?
c# - RWLock を使用して多くのリーダーと 1 つのライターのシナリオを実装するにはどうすればよいですか?
いくつかのメッセージを処理するメソッドを作成しようとしています。それらはメッセージの読み取りまたは書き込みです。並列読み取りは許可されますが、write
ロックが取得されると、後続のすべての読み取りロックは、書き込みロックが解放されるまで待機する必要があります。だから私ReaderWriterLockSlim
は私が必要なものだと思った。しかし、単純なアプリケーションを実装して期待どおりに動作するかどうかを確認しようとすると、Recursive read lock acquisitions not allowed in this mode
例外が発生します。
これがどのように機能するかを示す私の例です:
期待される結果: が 100 行、Readonly task start
が 1 行Write task start
、次に が 100 行Readonly task done
、次に が 1 行Write task done
、残りのプログラムが出力されます。
実結果:
ここで再帰がどこに現れるのかわかりません。再帰を一切行わずに、1 つの関数を呼び出しているだけです。記事を読みましたが、ここでどのように機能するかわかりません。
linux-kernel - Linux カーネル: 読み取り/書き込みロック rwlock (デッドロック) の動作が理解できない
(Linux カーネル) rwlock API を試していますが、なぜそれが起こっているのか理解できない動作 (デッドロック) が発生しています。誰か説明がありますか?(コードは実験用であり、背後にロジックがないことに注意してください。たとえば、スピンロックを保持している間にスリープするのは悪い考えであることはわかっていますが、テストするコードには影響しません)。
コードは次のとおりで、実行するとデッドロックが発生します。
ログを取得しています:
ランタイムを図式化しようとしました:
理解できない動作: なぜ (w) スレッドが 10 秒で回転し続けるのか疑問に思っています。状況はインスタント 3 秒と同じです。w が書き込みロックを取得しようとしたため、r2 が回転しています (r1 がロックを保持しているため、w が回転しています)。 r1 が完了すると、w のロックが解除され、実行が開始されます。これは 3 秒で発生しますが、10 秒では発生しません。
rust - 読み取りロック内で何かを変更するにはどうすればよいですか?
リーダーの数とライターの数の 2 つのフィールドを含む構造体があります。書き込みロックを使用するときは、writers の値を変更し、両方を出力します。読み取りロックを使用する場合、リーダーの数を変更してから両方の値を出力したいと考えています。私はそのようなことをすることができますか?または、ミューテックスを使用したある種のカウンターなど、別の方法がありますか?
c++ - 複数のリーダーの場合の RWLock と Mutex
私は C++ マルチスレッド アプリを実装しており、いくつかの変数でライターよりも多くのリーダー (少なくとも比率 30:1) があり、多くのリーダーに非常に適していると思われるため、pthread_rwlock
Mutex() の代わりに RWLocks(多分)を使用することを考えました。 std::mutex
.
私が読んだもの:
https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
https://www.arangodb.com/2015/02/comparing-atomic-mutex-rwlocks/
https://docs .oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/ReadWriteLock.html (javaでも原理は同じだと思います)
しかし、RWLock のカスタム実装には少なくともミューテックスが内部的に含まれているようですが、なぜ RWLock を使用するのでしょうか?