void WorkerThread::doLongTimeWork()
{
QMutexLocker locker(&mutex);
if (!isRunning()) {
start(QThread::LowPriority);
}
else {
condition.wakeOne();
}
}
函数doLongTimeWork(),里面构造了一个局部的QMutexLocker对象并锁住互斥量,当QMutexLocker被销毁的时候,互斥量将被自动解锁(因为QMutexLocker是个局部变量,当函数返回时它就被销毁),当执行函数doLongTimeWork()时,如果线程未运行,则调用start()开启线程,如果线程已经在运行了,则调用condition.wakeOne()唤醒线程。
void WorkerThread::run()
{
static int count = 0;
forever {
if (abort)
return;
mutex.lock();
//当处于wait状态时mutex会被暂时释放(会自动调用unlock解锁之前锁住的资源,避免造成死锁),并阻塞在这个地方;当线程被cond.wakeOne()等唤醒时,mutex又会被重新锁定,并继续运行
this->loadDataFromFile();
emit sendCount(count++);
condition.wait(&mutex);//QWaitCondition 用于多线程的同步,一个线程调用QWaitCondition::wait() 阻塞等待,直到另一个线程调用QWaitCondition::wake() 唤醒才继续往下执行
mutex.unlock();
}
}
run()中的condition.wait(&mutex)会让mutex会被暂时释放(会自动调用unlock解锁之前锁住的资源,避免造成死锁),并阻塞在这个地方,当线程被cond.wakeOne()等唤醒时,mutex又会被重新锁定,并继续运行。
注意QMutex与QWaitCondition区别:
QMutex::lock相当于临界区锁,让处于锁中的资源不能被别的线程访问,即自己霸着不让别人用。
QWaitCondition::wait相当于互斥量锁,让线程等着,当别的线程访问完了,自己才能访问,即自己排队等着别人用完自己再用。