問題タブ [qmutex]
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.
multithreading - QMutex がロック状態でスタックする
私はクラスの一部である関数を持っています。この関数には、関数の先頭にmutex.lockがあり、その戻りの直前にmutex.unlockがあります。現在、ミューテックスがロック状態でスタックしている状況に遭遇しました。この関数がそのミューテックスを使用してロックおよびロック解除する唯一の場所である場合、これを行うことができます。この関数は、メイン スレッドと 1 つまたは 2 つの他の QThreads から呼び出されます。
更新: 問題は、スレッドが関数呼び出し間でスリープしていないことが原因でした。たぶん、スリープの欠如がミューテックスを本当に速く再ロックしたのでしょうか? yieldCurrentThread(); を呼び出すこともできます。
c++ - Qt では、QMutex または QReadWriteLock の状態を照会するにはどうすればよいですか?
リソース オブジェクトへのアクセスを保護するために、アプリケーションでQReadWriteLockを使用しています。
可能な場合は QReadLocks と QWriteLocks を使用していますが、関数の境界を越える「長寿命」のロックが必要になる場合があります。したがって、すでにロックが解除されているミューテックスのロックを解除するのは非常に悪いため、QReadWriteLock (または QMutex、この状況では同じこと) の状態を照会できる必要がある場合があります。
QMutex の場合:
ロックされていないミューテックスをロック解除すると、未定義の動作が発生します。
QReadWriteLock の場合:
ロックされていないロックを解除しようとするとエラーになり、プログラムが終了します。
ミューテックスの状態を照会できることは、何らかの操作を開始する前にデバッグ アサーションでテストする場合にも非常に便利です。実際に「長寿命」のロックがあるかどうかを確認します。
しかし、私が本当に望んでいるのは、ロックを持っている場合はミューテックスのロックを解除でき、持っていない場合はロックを解除できないことだけです。それは私の一日になります。IMOunlock()
関数はすでにこれを行う必要がありますが、そうではありません。
これを回避する方法はありますか?
(いいえ、Recursive
モードを使用してもこの状況では役に立ちません)
c++ - Qt: 単一インスタンスのアプリ保護のベスト プラクティス
QSingleApplication
? QMutex
? QSharedMemory
? Windows、OSX、Linux (Ubuntu) でスムーズに動作するものを探しています。Qt 4.7.1 の使用
c++ - QMutexの使い方は?
私はQtの初心者で、Qtでマルチスレッドを探しています。Qt Documents
で
学んだように、2つのスレッドに対して2つのクラスを定義しました。
そしてCPPファイルで:
2番目のスレッドクラスは同じですがcounter--
、run()
メソッド内にあります。
次に、この2つのスレッドをから実行しmain.ccp
ます。
今私の質問:
どうすれば共有counter
しthread_a
てthread_b
使用できQMutex
ますか?
qt - このコードで QMutex が使用されているのはなぜですか?
私は他の誰かのコードを読んでいて、マルチスレッドアプリケーションの一部であるこのコードに遭遇しました。このコードは、 QThreadrun()
から継承されたクラスの関数の一部です。QMutexは、変数が複数のスレッドによって同時に変更されるのを防ぐために使用される
と思いました。しかし、ここにクラスのメンバーがいます。したがって、クラスのインスタンスごとに作成されます。
私はミューテックスについて間違っていますか? プログラマーは間違ったコードを書きましたか :) ? または、ここでミューテックスには別のアプリケーションがありますか?stopped
停止の宣言は次のとおりです。
c++ - QThread を使用した QMutex - セグメンテーション違反
QMutex と QWaitCondition を使用して実装された一時停止/再開メカニズムを備えた QThread を使用する C++ Qt プログラムがあります。それがどのように見えるかです:
MyThread.h:
MyThread.cpp:
MyThread クラスのベクトルを使用します。
pause()
のメソッドを呼び出すとMyClass
、(デバッグ モードで) MyThread.cpp の 3 行目を指しているセグメンテーション エラー シグナルが表示されますsyncMutex.lock();
。インスタンスの量には依存しませんMyThread
- std::vector に 1 つのスレッドがあっても壊れます。
何か重要なものを見逃したと確信していますが、何がわかりません。私は何を間違っていますか?
(問題がある場合は、Qt 5 で MinGW 4.7 コンパイラを使用します)
c++ - このクラスインスタンスの他のスレッド呼び出しが操作を中断することを認識できるように、QMutex は静的である必要がありますか?
複数のスレッドから、次の追加関数が呼び出されます。カウンターがまだインクリメントされていないため、データに追加を再書き込みさせたくありません。
これにより、現在追加を使用しているスレッドを除いて、入ってくるすべてのスレッドが中断されますか? それとも、他のスレッドは実行を継続し、データを追加しませんか?
ミューテックスは「静的」である必要がありますか、それとも各インスタンスは操作を中断することを知っていますか?
問題が発生したくない場合は、ログ データをバックアップするためのバッファーを構築する必要があると思いますか?
synchronization - QMutex が少ない場合、最初のロック解除された QMutex を待機しています
2 つの QMutex オブジェクトがあり、両方をロックする必要がありますerase()
。しかし、順序は重要ではありません。
そのため、今は 1 つの QMutex がロック解除 ( QMutexLocker locker(&listMutex)
) 状態にある間待機し、別の ( ) 状態を待機していQMutexLocker locker(&writeMutex)
ます。
ただし、最初にロック解除されるミューテックスを待つ方が効率的です。そして、もう一方を待ちます。よりも待ち時間が短くなります。
そのような動作をどのように実装できますか?
追加の再帰 QMutex または QSemaphore を作成し、両方の QMutex の状態をこの新しいオブジェクトと同期し、QMutex ではなくこの新しいオブジェクトを待つ必要があります。
それはうまくいくはずですが、QMutex オブジェクトを複製せずにもっと簡単な方法があるのではないでしょうか?