一、目的
在Qt多线程程序开发中,经常会碰到一个线程需要阻塞等待一个资源或者一个事件发生。或者需要与另一个线程进行同步。
基于以上需求,下面用QSemaphore,QWaitcondition和 QMutex三种方式实现线程的同步运行。
二、设计
#include <QApplication>
#include <QThread>
#include <QDebug>
#include <QWaitCondition>
#include <QMutex>
#include <QSemaphore>
//选择对应同步方式:3选1
//#define SEMAPHORE
#define WAITCONDITION
//#define MUTEX
#if defined (SEMAPHORE)
QSemaphore source(0);
#elif defined (WAITCONDITION)
QWaitCondition MsgWait;
QMutex mutex;
#elif defined (MUTEX)
QMutex mutex;
#endif
class Producer : public QThread
{
public:
Producer(){}
void run();
};
class Consumer : public QThread
{
public:
Consumer(){}
void run();
};
void Producer::run()
{
int cnt = 0;
while(1)
{
#if defined (SEMAPHORE)
cnt++;
qDebug()<<"Pcnt="<<cnt;
source.release(1);
QThread::sleep(1);
#elif defined (WAITCONDITION)
mutex.lock();
cnt++;
qDebug()<<"Pcnt="<<cnt;
MsgWait.wakeAll();
mutex.unlock();
QThread::sleep(1);
#elif defined (MUTEX)
cnt++;
qDebug()<<"Pcnt="<<cnt;
QThread::sleep(1);
mutex.unlock();
#endif
}
}
void Consumer::run()
{
int cnt = 0;
while(1)
{
#if defined (SEMAPHORE)
source.acquire(1);
cnt++;
qDebug()<<"Ccnt="<<cnt;
#elif defined (WAITCONDITION)
mutex.lock();
MsgWait.wait(&mutex);
cnt++;
qDebug()<<"Ccnt="<<cnt;
mutex.unlock();
#elif defined (MUTEX)
mutex.lock();
cnt++;
qDebug()<<"Ccnt="<<cnt;
#endif
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Producer p;
Consumer c;
#if defined (SEMAPHORE)
//顺序随便调
p.start();
c.start();
#elif defined (WAITCONDITION)
c.start();
usleep(1);
p.start();
#elif defined (MUTEX)
p.start();
usleep(1);
c.start();
#endif
p.wait();
c.wait();
return a.exec();
}