公众号:Qt那些事儿
QMutex
锁是多线程同步常用的方法
Qt的锁 - QMutex。
C++的锁 - std::mutex;
QMutex可以手动调用Lock跟UnLock来加锁跟解锁。
但是既然我们都写C++的,还是充分利用C++的RAII的来进行资源管理,避免线程意外停止,发生死锁。
QMutexLocker
可以看下Qt中QMutexLocker的实现
inline ~QMutexLocker() { unlock(); }
在QMutex锁的生命周期结束以后,自动解锁。
对应C++的类就是
std::lock_guard:方便线程对互斥量上锁。
std::unique_lock:方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。
普通的线程同步,使用QMutexLocker就可以。
这时候可以上栗子了
栗子
两个线程,依次输出12345678。。。
我这里用QThread举例,你当然可以用继承QObject的方式来实现。
namespace
{
QMutex mutex;
static int index = 0;
}
class WorkerThread : public QThread
{
Q_OBJECT
public:
WorkerThread(QObject *parent = 0)
: QThread(parent)
{
setObjectName("WorkerThread");
}
protected:
void run()
{
while(true)
{
QMutexLocker locker(&mutex);
index ++;
Sleep(2000);
qDebug()<<this->objectName()<<"---"<<index<<endl;
}
}
};
class WorkerThread1 : public QThread
{
Q_OBJECT
public:
WorkerThread1(QObject *parent = 0)
: QThread(parent)
{
setObjectName("WorkerThread1");
}
protected:
void run()
{
while(true)
{
QMutexLocker locker(&mutex);
index ++;
Sleep(2000);
qDebug()<<this->objectName()<<"---"<<index<<endl;
}
}
};
然后这样调用
WorkerThread thread;
WorkerThread1 thread1;
thread.start();
thread1.start();
thread.wait();
thread1.wait();
我这里贴上输出
"WorkerThread" --- 1
"WorkerThread1" --- 2
"WorkerThread" --- 3
"WorkerThread1" --- 4
"WorkerThread" --- 5
。。。
代码很简单,工程代码在这里
https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread4