6

QReadWriteLock を再帰モードで使用しています。

このコードはそれ自体では意味がありませんが、ここから発生した問題は次のとおりです。

lock->lockForWrite();
lock->lockForRead();

lockForRead がブロックされています。これは再帰モードであることに注意してください。

私が見る方法は、書き込みが「優れた」ロックであるということです。これにより、保護されたデータの読み取りと書き込みが可能になります。読み取りロックでは読み取りのみが許可されます。

また、唯一のリーダーが書き込みロックを要求しているのと同じ場合、書き込みロックはブロックされるべきではないと思います。

qreadwritelock.cpp ソースコードから、私が望むように動作させる試みがないことがわかります。したがって、これはバグではなく、欠けている機能です。

私の質問はこれです、この種の再帰は許可されるべきですか? この種の実装から生じる問題はありますか? また、それは何でしょうか?

4

2 に答える 2

4

QReadWriteLock ドキュメントから:

再帰的にロックしようとすると、ロックの種類を変更できないことに注意してください。つまり、既に書き込み用にロックされているスレッドを読み取り用にロックすることはできません (その逆も同様です)。

だから、あなたが言うように、それはまさにそれが機能する方法です。個人的には、ロックされたアイテムの書き込みと同じスレッドでの読み取りを許可すると問題が発生することはわかりませんが、おそらく非効率的なロックの実装が必要になるのでしょうか?

QT フォーラムで質問することもできますが、決定的な回答が得られるとは思えません。スターターとして QT ソースを使用し、必要なものがあれば自分で実装してみませんか。同期オブジェクトの記述は難しい場合がありますが、学習には適しています。

于 2012-09-12T07:49:41.920 に答える