QT——QWaitCondition


它为同步线程提供了一个条件变量。

加入头文件:

#include <QWaitCondition>

函数:

QWaitCondition ()
virtual  ~QWaitCondition  ()
bool  wait (QMutex  *  mutex,unsigned  long  time = ULONG_MAX)
1) 释放锁定的mutex

 2) 在线程对象上等待

mutex必须由调用线程进行初锁定 。注意调用wait的话,会自动调用unlock解锁之前锁住的资源,不然会造成死锁。

线程1等待线程2来改变共享资源,从而达到一定的条件然后发出信号,使得线程1从wait中的阻塞状态中被唤醒。

但是线程2想改变资源,却无法办到,因为线程1调用lock之后就在wait中blocking,了但是没有及时的unlock,那么这就

构成了死锁的条件。所以说wait函数除了使调用线程切换到内核态之外,还自动unlock(&mutex)

void  wakeOne ()
  • 这将会唤醒所有等待QWaitCondition的线程。这些线程被唤醒的顺序依赖于操组系统的调度策略,并且不能被控制或预知。

void wakeAll ()

这将会唤醒所有等待QWaitCondition的线程中的一个线程。这个被唤醒的线程依赖于操组系统的调度策略,并且不能被控制或预知。

 

例子:

#include<QtCore/QCoreApplication>
#include <QMutex>
#include <QWaitCondition>
#include <QThread>
QWaitCondition mycond;
class mythread:public QThread
{
 Q_OBJECT
public:
 mythread(QObject * parent);
 ~mythread();

 void run(); 
private:
 int count;
 QMutex mutex;

};
mythread::mythread(QObject *parent)
: QThread(parent)
{

}

mythread::~mythread()
{

}

void mythread::run()
{
 mutex.lock();
 mycond.wait(&mutex);
 count++;
 mutex.unlock();
 //do some things
 mutex.lock();
 count--;
 mutex.unlock();
}
int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);
 mythread *th=new mythread(0);
 th->start();
 th->wait();
 QChar ch=getchar();
 if (ch=='a')
 {
  mycond.wakeAll();
 }
 return a.exec();
}

 


你可能感兴趣的:(QT——QWaitCondition)