我有一个工作线程,它通过 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 文档中发现了这一点:
无效 QMutex::unlock ()
解锁互斥锁。尝试在与锁定它的线程不同的线程中解锁互斥锁会导致错误。解锁未锁定的互斥锁会导致未定义的行为。
我有两个问题:
这种限制在不同线程中解锁的原因是什么?(为什么我看不到文档所说的错误?)
我应该用什么代替 QMutex 来实现我想要的?QWaitCondition 会是一个合适的替代品吗?