Qt线程的简单使用(四)——QSemaphore的使用
参考资料:示例来源 http://www.cnblogs.com/venow/archive/2012/10/15/2724943.html
Qt 帮助手册 QSemaphore
QSemaphore提供了一定数量的信号量。
一个 semaphore信号量是一种泛化的mutex。一个mutex只能被锁住一次,但是semaphore被获取多次。信号量通常被用于保护一定数量的同种资源。
Semaphore提供两种基本的操作,acquire() and release():
Acquire(n)尝试去n个资源。如果获取不到足够的资源,这个会一直锁住直到可以获取足够的资源。
Release(n)释放n个资源。
除了以上的方法,还有tryAcquire()函数,如果得不到足够的资源会立即返回,available()函数,返回在任意时刻可用的资源数目。
以下是一个生产者/消费者的例子,可以理解QSemaphore的具体使用
1 #include <QtCore/QCoreApplication> 2 #include <QSemaphore> 3 #include <QThread> 4 #include <iostream> 5 #include <QTime> 6 7 const int DataSize = 100; 8 const int BufferSize = 10; 9 char buffer[BufferSize]; 10 QSemaphore freeSpace (BufferSize); 11 QSemaphore usedSpace(0); 12 //1.BufferSize = 1 ,DataSize = 100,生产一个,消费一个。 13 //2.BufferSize = 100,DataSize = 100;先是大量生产。 14 15 16 17 //生产者 18 class Producer:public QThread 19 { 20 protected: 21 void run() 22 { 23 qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); 24 qsrand(NULL); 25 for (int i = 0;i < DataSize;++i) 26 { 27 freeSpace.acquire(); 28 std::cerr<<"P"; 29 usedSpace.release(); 30 } 31 } 32 }; 33 //消费者 34 class Consumer:public QThread 35 { 36 protected: 37 void run() 38 { 39 for (int i = 0;i < DataSize;++i) 40 { 41 usedSpace.acquire(); 42 std::cerr<<"C"; 43 freeSpace.release(); 44 } 45 } 46 }; 47 48 int main(int argc, char *argv[]) 49 { 50 QCoreApplication a(argc, argv); 51 52 Producer producer; 53 Consumer consumer; 54 producer.start(); 55 consumer.start(); 56 producer.wait(); 57 58 consumer.wait(); 59 60 return a.exec(); 61 }
宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己!
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流。转载请注明出处。