問題タブ [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.

0 投票する
2 に答える
1224 参照

multithreading - QMutex は一方のスレッドでロックし、もう一方のスレッドでロック解除します

QMutex を奇妙な方法で使用することはできますか? QMutex を 1 つのスレッドでロックし、別のスレッドでロック解除しますか?

0 投票する
1 に答える
1512 参照

qt - QMutex - グローバルミューテックス変数が必要ということですか?

2 つの方法で機能するミューテックスを実装する必要があります。1. 複数のクラスからリソースを保護し、2. スロットであり、再入可能であるクラスのメソッドからリソースを保護します。例 (疑似 C++):

  1. A.aaa によって中断された A.aaa が処理されるため、シナリオ 2 がカバーされているというこの投稿を読みました (どういうわけか Qt/OS は、保護されているのと同じリソースであることを認識しています。そうですか?

  2. A.aaa と B.bbb が同じリソースを保護している場合、Qt/OS は同じリソース/ミューテックスを認識していないため、機能しないと思いますか? 複数の無関係なクラスが安全にアクセスできるように、変数ミューテックスはグローバルである必要があるということですか?

0 投票する
1 に答える
36 参照

multithreading - 異なるスレッドから同じ変数にアクセスして書き込もうとした 2 つの関数に、mutexlocker の両方を追加する必要がありますか?

以下はグローバル変数です。

2 つのスレッドABは、スレッドAの関数である変数iにアクセスして書き込みを試みます。

およびスレッドBプロセス関数:

QMutexLockerを 2 つの関数に追加するか、1 つだけ追加する必要がありますか? 1つだけ追加できますか?

0 投票する
3 に答える
5576 参照

c++ - Qt でのクリティカル セクションの処理

私はこの質問に対する答えをたくさん探しましたが、何もないようです。

Qt 5.2.0 を使用して、winsocks2 で TCP クライアントを作成しています。使用言語はC++です。接続ループ (send() と write() を呼び出す場所) を作成するために、QThread を使用しています (ここで読むことができますhttp://qt-project.org/doc/qt-4.8/qthread.html )。これまでのところうまくいきましたが、プログラムが何かを書いたり読んだりしているときにコンテキストの切り替えがないことを確認したいと思います. だから私はクリティカルセクションが正しい方法だと思っていましたが、インターネットでの検索ではそれを行う方法が見つかりませんでした.Qtの公式ドキュメントでさえクリティカルセクションへの参照はありません.

それからここに私の質問があります: Qt でクリティカル セクションを使用する方法はありますか? コンテキストの切り替えを避けたいセクションにミューテックスを配置し、他の場所にミューテックスを配置する必要がありますか? 肯定の場合、これらのミューテックスをどの部分に配置する必要がありますか?

私の英語で申し訳ありません。前もって感謝します。

他に伝えられることがあれば、教えてください。

ムリーロ GK

0 投票する
0 に答える
956 参照

qt - QMutex でロックを取得できません

私が現在取り組んでいるアプリケーションは、スレッド間で共有される多くのリソースを使用して、高度にマルチスレッド化されています。共有リソースを保護するために QMutex を使用しますが、実際には、同じミューテックスを同時にロックしようとする異なるスレッド間で競合が発生することはほとんどありません。

それにもかかわらず、私は自分のアプリケーションがガタガタと停止するという悲惨な頻度を見つけます。実行を中断して何が起こっているかを確認すると、必要なミューテックスのロックを取得できないため、スレッドが停止していることがわかりました。

ミューテックスが常に同じスレッドからロックおよびロック解除されることを確認しました-実際、ほとんどの場合、同じ中括弧ブロック内にあります-そして、トラブルシューティングの最新のラウンドで、すべての裸の QMutex を定義済みの「nMutex」オブジェクトに置き換えました次のように:

...そして、私のすべての呼び出しを mutex.lock() に置き換えました

私が見つけたのは、これが非常に頻繁に失敗することであり、失敗した場合は常に「locks = 0」と報告されます。つまり、他のスレッドには既にミューテックスがありませんが、それを取得しようとしているスレッドは取得できません. 私のコードのどこで mutex.lock() への呼び出しが行われたかに関係なく、失敗は一見ランダムに発生します。

現在、私は2つの可能性を見ることができます:

(1) 私は非常に愚かで、上記のアプローチのどこかが間違っていることに気づいていません。

(2) QMutex にバグがあります。私はレポートを見たことがないので、これはありそうにないようです.Qt 5.3と5.4の少なくとも3つのバージョン(最新の5.4.1を含む)でこれを試しました.

これら 2 つの可能性のうち、どちらが正しい可能性が高いかをテストする方法はありますか? 例えば、ミューテックスが取得できない場合、その理由を具体的に調べる方法はありますか?