問題タブ [qreadwritelock]
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.
c++ - Qt では、QMutex または QReadWriteLock の状態を照会するにはどうすればよいですか?
リソース オブジェクトへのアクセスを保護するために、アプリケーションでQReadWriteLockを使用しています。
可能な場合は QReadLocks と QWriteLocks を使用していますが、関数の境界を越える「長寿命」のロックが必要になる場合があります。したがって、すでにロックが解除されているミューテックスのロックを解除するのは非常に悪いため、QReadWriteLock (または QMutex、この状況では同じこと) の状態を照会できる必要がある場合があります。
QMutex の場合:
ロックされていないミューテックスをロック解除すると、未定義の動作が発生します。
QReadWriteLock の場合:
ロックされていないロックを解除しようとするとエラーになり、プログラムが終了します。
ミューテックスの状態を照会できることは、何らかの操作を開始する前にデバッグ アサーションでテストする場合にも非常に便利です。実際に「長寿命」のロックがあるかどうかを確認します。
しかし、私が本当に望んでいるのは、ロックを持っている場合はミューテックスのロックを解除でき、持っていない場合はロックを解除できないことだけです。それは私の一日になります。IMOunlock()
関数はすでにこれを行う必要がありますが、そうではありません。
これを回避する方法はありますか?
(いいえ、Recursive
モードを使用してもこの状況では役に立ちません)
c++ - QReadWriteLock 再帰モードが機能しない
gcc 4.4.3 を使用する Linux qt 4.7.4 では、次のコードは正常にコンパイルされ、実行時エラーは発生しません。
ロックは同じスレッドによって数回ロックされ、何も起こりません。マニュアルによるとhttp://doc.qt.io/archives/qt-4.7/qreadwritelock.html
ロックは、同じスレッドによって一度だけロック可能であるべきです。これは重大なバグですか、それともマニュアルを誤解していますか?
Chris への返信: ロックは NonRecursive でも数回ロック解除する必要があります。1 つのロック解除がコメント アウトされている場合、次のコードは "Writing" を出力しません。