Qt信号量QSemaphore
2012-10-15 20:12
302 查看
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
当DataSize = 100, BufferSize = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个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之使用QSemaphore信号量同步线程小例子
- QT 信号量QSemaphore的使用
- Qt信号量QSemaphore
- 【Qt多线程之信号量】Qsemaphore
- QT——QSemaphore(信号量)
- Qt的QWaitCondition、信号量QSemaphore
- Qt信号量QSemaphore
- Qt程序在开发板上运行,提示不能创建信号量。
- Qt生产者消费者实验(1):信号量
- QT 信号量
- Qt之线程同步(生产者消费者模式 - QSemaphore)
- QT 中的生产者和消费者信号量
- QT 信号量
- Qt : QThread中的互斥、读写锁、信号量、条件变量
- QT多线程同步 互斥缩 信号量 读写所 ...
- QSemaphore 信号量
- Qt 线程同步(QMutex、QWaitCondition、QSemaphore)
- Qt之线程同步(生产者消费者模式 - QSemaphore)
- QT_自定义信号量和槽
- Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)