【发布时间】:2013-11-07 21:37:11
【问题描述】:
我有一个工作线程,它通过 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 ()
解锁互斥锁。尝试在与锁定的线程不同的线程中解锁互斥锁 这会导致错误。解锁未锁定的互斥锁会导致未定义的行为。
我有两个问题:
-
这种限制在不同线程中解锁的原因是什么? (为什么我看不到文档所说的错误?)
-
我应该使用什么来代替 QMutex 来实现我想要的? QWaitCondition 会是一个合适的替代品吗?
【问题讨论】:
-
为什么不使用信号槽直接传递数据,甚至与
invokeMethod调用一起传递 -
@ratchetfreak 这将涉及数据复制,而我想避免它。
标签: multithreading qt