Qt多线程
QThread
结束线程的方式
terminate 直接结束线程,会导致线程没有机会释放资源,因此不建议使用。若要使用,必须有十分充足的理由
quit 如果线程中没有event loop,那么此函数什么都不做;否则就通知event loop结束自己并返回0(0代表成功)
wait 调用quit后,线程不会立刻结束(例如,run函数中还有尚未执行的代码)。此时,可以通过调用wait来确保等待run函数运行完毕。wait中可以传入参数,表示在指定的时间内,若线程还不结束,那么就直接强制结束线程。
启动线程的方式:
调用start
线程的执行代码都在run中,其中,run的缺省实现如下:
1 void QThread::run() 2 { 3 (void) exec(); 4 }
其中,exec会启动event loop。如果我们重写了run,并且需要event loop的话,那么我们要自己去调用exec()
线程同步:
1、QMutex,互斥量。用来保护某一段代码在同一时刻只能被一个线程访问:
首先定义一个全局的mutex:QMutex mutex
{
mutex.lock();
// put your code here
mutex.unlock();
}
上面这种做法是有潜在的问题的:如果程序在lock和unlock之间出现异常的话,那么mutex将再也没有机会被unlock了。
此问题的解决方法是,使用QMutexLocker:
{
QMutexLocker mutexLocker(&mutex);
// put your code here
}
2、QWaitCondition
给QWaitCondition::wait传入一个已经lock了的QMutex。此时该QMutex会被解锁,然后线程会等待QWaitCondition。等到其他线程调用QWaitCondition::wakeAll后,该QMutex会回到锁定状态,并且线程会继续执行
3、QSemaphore
QSemaphore是QMutex的扩展。QMutex只能锁定一次,QSemaphore可以锁定多次,主要用于保护具有一定数量的资源