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時,程序運行的界面如下,結果是不可預期的。這里只是列舉兩種情況。
情況之一:

情況之二:

