Qt的QWaitCondition、信号量QSemaphore
2015-05-26 15:11
253 查看
Qt的QWaitCondition
对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程。其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件满足时唤醒所有等待线程。下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
#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; 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; }
当DataSize = 100, BufferSize = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
#include <QtCore/QCoreApplication> #include <QSemaphore> #include <QThread> #include <iostream> #include <QTime> const int DataSize = 100; const int BufferSize = 1; char buffer[BufferSize]; QSemaphore freeSpace(BufferSize); QSemaphore usedSpace(0); class Producer : public QThread { protected: void run() { qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); qsrand(NULL); for (int i = 0; i < DataSize; ++i) { freeSpace.acquire(); std::cerr<<"P"; usedSpace.release(); } } }; class Consumer : public QThread { protected: void run() { for (int i = 0; i < DataSize; ++i) { usedSpace.acquire(); std::cerr<<"C"; freeSpace.release(); } std::cerr<<std::endl; } }; int main(int argc, char *argv[]) { Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return 0; }
当DataSize = 100, BufferSize = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
相关文章推荐
- Qt 线程同步(QMutex、QWaitCondition、QSemaphore)
- Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)
- Qt QWaitCondition的应用
- Qt信号量QSemaphore
- Qt之线程同步(生产者消费者模式 - QWaitCondition)
- Qt的QWaitCondition
- Qt生产者消费者实验(2):等待条件QWaitCondition
- Qt生产者消费者实验(2):等待条件QWaitCondition
- QT 信号量QSemaphore的使用
- Qt生产者消费者实验:等待条件QWaitCondition
- Qt的QWaitCondition
- QT之使用QSemaphore信号量同步线程小例子
- Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)
- 一个Qt线程的例子,用于说明QWaitCondition的作用
- QT之使用 QWaitCondition 同步线程小例子
- 【Qt多线程之信号量】Qsemaphore
- Qt的QWaitCondition
- Qt之线程同步(生产者消费者模式 - QWaitCondition)
- 一个Qt线程的例子,用于说明QWaitCondition的作用
- Qt的QWaitCondition