1

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

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

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

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

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

ムリーロ GK

4

3 に答える 3

2

Qt では、コンテキスト切り替えなしでクリティカル セクションを実装する方法はありません。

Qt でクリティカル セクションを実装する場合は、QReadLockerQWriteLockerを使用してください。

于 2016-07-11T09:53:53.337 に答える
0

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

あなたが示しているように見えるのは、同時実行のみを扱うアプリケーションクリティカルセクションではなく、カーネルレベルのクリティカルセクションです。カーネル レベルのクリティカル セクションは、カーネル モードのみにあり、ユーザー アプリケーションとは関係ありません。コンテキストの切り替えはカーネル レベルのアイデアであり、ユーザー モードではありません。

プロセッサ アフィニティについて質問している場合は、OS 固有のコマンドを使用して設定する必要があります。Qt はプロセッサ アフィニティを抽象化しません。これは、プロセスがスケジュールされたときにコア間でジャンプしないことを確認する唯一の方法です。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx

注: これらの関数が実際に役立つ状況はほとんどありません。最新のスケジューラは、キャッシュ ミスを最小限に抑えるために、以前に実行していたのと同じコアで特定のスレッドを再スケジュールすることをすでに望んでいます。

複数のスレッドによる同じデータ構造への同時アクセスについて質問している場合は、QMutex などが探しているものです。

于 2014-03-17T05:46:28.370 に答える
0

それからここに私の質問があります: Qt でクリティカル セクションを使用する方法はありますか?

Qt の代替はQMutex. 残念ながら、Windows のクリティカル セクションよりもはるかに遅いことに注意してください。私の経験では、これが、特定のクライアントがプロジェクトで Qt の使用をやめた大きな理由の 1 つです。これは、代替ソリューションよりも大幅に遅くなる Qt の一部です。

コンテキストの切り替えを避けたいセクションにミューテックスを配置し、他の場所にミューテックスを配置する必要がありますか?

それが最も Qt らしい方法ですが、Qt ソフトウェアにおいても、Qt らしいとは必ずしも最良の方法であるとは限りません。正確なシナリオに応じて、ケースバイケースで判断する必要があります。この環境で効率がどれほど重要であるか、また、(近い将来?) 将来に複数のプラットフォームをサポートするかどうかを自問する必要があります。

肯定の場合、これらのミューテックスをどの部分に配置する必要がありますか?

これは一般的なスレッド プログラミングの質問です。共有リソースを同期する必要がある場合は、スレッド プリミティブを使用します。ここでは、一般的な Qt スレッドについてもう少し読むことができます。

Qt でのスレッドのサポート

ソフトウェアで Qt 以外のものを使用するかどうかは現時点では不明ですが、使用する場合は、スターターが作業を完了するためにネイティブ Windows API を使用するという考えをやめることをお勧めします。プロジェクトで Qt の使用がボトルネックになった場合は、後でいつでもフォールバックできます。

于 2014-03-16T04:39:51.553 に答える