TCP 経由でデータを送信し、他のいくつかのスレッドからそのデータを取得するワーカー スレッドがあります。ある種のミューテックスを使用してデータを入力し、別のスレッドのメソッドを呼び出す必要があります。これにより、終了時にミューテックスのロックが解除され、呼び出し元のスレッドが独自のジョブを続行します。
次のように、Qtを使用してこれを最初に実装しました。
Data globalData;
QMutex mutex;
void requestSend() // several such functions in other threads
{
mutex.lock(); // we want to change the data
globalData=fillData();
invokeMethod(workerClass,"work",Qt::QueuedConnection);
}
void work() // a slot in a class instanced in worker thread
{
sendData(globalData);
mutex.unlock(); // data is now available to be changed
}
これは合理的で機能しているように見えますが、QMutex のドキュメントでこれを見つけました。
void QMutex::unlock ()
ミューテックスのロックを解除します。ミューテックスをロックしたスレッドとは別のスレッドでミューテックスをロック解除しようとすると、エラーが発生します。ロックされていないミューテックスをロック解除すると、未定義の動作が発生します。
2 つの質問があります。
別のスレッドでロックを解除するためのそのような制限の理由は何ですか? (そして、ドキュメントに記載されているエラーが表示されないのはなぜですか?)
QMutex の代わりに何を使用すれば、目的を達成できますか? QWaitCondition は適切な代替品でしょうか?