#include <QtCore/QCoreApplication> #include <QWaitCondition> #include <QThread> #include <QMutex> #include <iostream> const int DataSize = 100; const int BufferSize = 1; char buffer[BufferSize]; QWaitCondition bufferIsNotFull; QWaitCondition bufferIsNotEmpty; QMutex mutex; int usedSpace=0; class Producer : public QThread { protected: void run() { for (int i = 0; i < DataSize; ++i) { mutex.lock(); while (usedSpace == BufferSize) { bufferIsNotFull.wait(&mutex); } std::cerr<<"P"; ++usedSpace; bufferIsNotEmpty.wakeAll(); mutex.unlock(); } } }; class Consumer : public QThread { protected: void run() { for (int i = 0; i < DataSize; ++i) { mutex.lock(); while (usedSpace == 0) { bufferIsNotEmpty.wait(&mutex); } std::cerr<<"C"; --usedSpace; bufferIsNotFull.wakeAll(); mutex.unlock(); } std::cerr<<std::endl; } }; int main(int argc, char *argv[]) { Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return 0; }
1.void QMutex::lock() 和void QMutex::unlock()
lock用于锁定一个对象,数据结构或代码段,相当于操作系统中的P操作
unlock则反过来,相当于操作系统中的V操作
2.QWaitCondition它允许线程在一定条件下唤醒其他线程。
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time = ULONG_MAX)
一旦调用,会解除当前的lock,变成unlock状态,互斥资源等待其他线程改变它的值,直到达到某一条件,使得线程重新唤起。
代码的调用顺序,start以后线程启动,wait后调用消费者的run函数。满足while条件后调用wait函数,进入阻塞状态。解锁后调用生产者run,锁定usedSpace变量,然后执行改变usedSpace变量。调用wakeall唤醒所有线程(消费者线程)。之后又满足生产者while条件,执行wait函数,把生产者线程进入阻塞状态,解锁usedSpace变量。在循环
通过pv操作,和wait操作就完成了进程同步。