QMutexLocker(比QMutex更简单的让线程安全的方式)
今天在看别人的代码时,看到了QMutexLocker这个类,一看居然没有解锁的代码,于是就产生了好奇,特此记录一下。
注意:这个类中的所有函数都是线程安全的。
#include
创建:创建的时候就是为下面代码加锁的时候
QMutexLocker ( QMutex * mutex );
为什么要引入QMutexLocker,大家都知道QMutex是为了线程安全而产生的,同理QMutexLocker也是,只是它相对于QMutex要简化了许多,也比较不容易出错。
咋们来看下下面的代码:
QMutex mutex; int complexFunction(int flag) { mutex.lock(); int retVal = 0; switch (flag) { case 0: case 1: mutex.unlock(); return moreComplexFunction(flag); case 2: { int status = anotherFunction(); if (status 10) { mutex.unlock(); return -1; } break; } mutex.unlock(); return retVal; }
在每个函数出口的时候都要解锁一遍,这不仅增加了代码的复杂性也增加了发生错误的可能性。
咋们再来看看使用QMutexLocker的时候,有多简单:
QMutex mutex;int complexFunction(int flag) { QMutexLocker locker(&mutex); int retVal = 0; switch (flag) { case 0: case 1: return moreComplexFunction(flag); case 2: { int status = anotherFunction(); if (status 10) return -1; break; } return retVal; }
当QMutexLocker对象被销毁时,互斥锁将始终处于解锁状态。也就是说当这个函数执行完,QMutexLocker就会因为自身的机制解锁。