參考資料:示例來源 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 }
