5

QBufferReadWriteモードで使用しています。1人のワーカーQThreadがデータをバッファーにプッシュし、別のワーカーがバッファーQThreadから読み取ります。

スレッドセーフを保証しますか、それともミューテックスのものQBufferから派生して追加する必要がありますか?QBuffer

4

5 に答える 5

9

MarkSummerfieldの著書C++GUI Programming with Qt 4を引用するには:

Qtのスレッドセーフクラスには、QMutex、QMutexLocker、QReadWriteLock、QReadLocker、QWriteLocker、QSemaphore、QThreadStorage、およびQWaitConditionが含まれます。さらに、QThread APIの一部と他のいくつかの関数、特にQObject :: connect()、QObject :: disconnect()、QCoreApplication :: postEvent()、およびQCoreApplication :: removePostedEvents()はスレッドセーフです。

Qtは、ほとんどのクラスでロックメカニズムを使用することを期待しています。ドキュメントには、「すべての関数はスレッドセーフです」と記載されており、個々の関数にも「スレッドセーフ」と指定されています。

Qtクラスに関する注意

多くのQtクラスは再入可能ですが、スレッドセーフにすることは、QMutexを繰り返しロックおよびロック解除するという余分なオーバーヘッドが発生するため、スレッドセーフにはなりません。たとえば、QStringは再入可能ですが、スレッドセーフではありません。複数のスレッドから同時にQStringの異なるインスタンスに安全にアクセスできますが、複数のスレッドから同時にQStringの同じインスタンスに安全にアクセスすることはできません(QMutexでアクセスを自分で保護しない限り)。

一部のQtクラスおよび関数はスレッドセーフです。これらは主にスレッド関連のクラス(例:QMutex)と基本的な関数(例:QCoreApplication :: postEvent())です。

QBufferはの直接のサブクラスであるため、QIODevice特にスレッドセーフではないと予想されますが、読み取りアクセスではスレッドセーフであるが、書き込みアクセスではロックが必要なコンテナクラスがあります。

コンテナクラス

コンテナクラスは暗黙的に共有され、再入可能であり、速度、低メモリ消費、最小限のインラインコード拡張のために最適化されているため、実行可能ファイルが小さくなります。さらに、それらにアクセスするために使用されるすべてのスレッドによって読み取り専用コンテナーとして使用される状況では、スレッドセーフです。

于 2012-12-13T17:39:07.183 に答える
2

QBufferスレッドに書き込むとバッファが大きくなるため、スレッド間で通信するための最良の方法ではありませんが、スレッドから読み取ると、最初にデータが削除されることはありません。

QByteArray代わりに、パラメータでsignal / slotを使用したり、自分QLocalSocketから派生したスレッドセーフなリングバッファクラスを使用または記述したりできQIODeviceます。

于 2012-12-13T20:47:50.837 に答える
1

これはQIODeviceを拡張し、そこにあるドキュメントにはQIODeviceのすべてのメソッドが再入可能であると記載されていますが、その上にスレッドセーフは指定されていません。QBufferがこれ以上何も言及していないことを考えると、QBufferはスレッドセーフではないと思います。

http://qt-project.org/doc/qt-4.8/qiodevice.html

于 2012-12-13T17:40:12.220 に答える
0

Qtのスレッド間で通信する最も簡単な方法は、他のスレッドのイベントキューにイベントを投稿することです。これは、他のスレッドがイベントループをスピンすることを前提としています。通常は新しいデータなどをチェックする場所で定期的にスピンするだけです。

于 2013-09-06T15:57:15.360 に答える
0

他のいくつかの投稿者が指摘しているように、QBufferは、スレッドセーフの問題に関係なく、この作業には不適切なツールです。

Qtにプロセス内ローカルパイプはありますか?意図された目的により適したQIODeviceベースのFIFOキューについて説明します(ただし、スレッドセーフメカニズムは含まれていません)。

于 2019-01-09T19:42:50.103 に答える