Qt文档阅读笔记-Semaphores Example解析(信号量并发实例)
這個例子展示了在Qt中使用多線程,在并發程序中使用QSemaphore要比QMutex高級。
這個例子是生產者生成數據,消費者消費數據,QSemaphore等同于QWaitCondition?+?QMutex。
?
下面的這些代碼中
const int DataSize = 100000;const int BufferSize = 8192; char buffer[BufferSize];QSemaphore freeBytes(BufferSize); QSemaphore usedBytes;?
這里的DataSize是循環的總次數,freeBytes(BufferSize)是指目前freeBytes的閾值為8192,而usedBytes的閾值為0,這個閾值的作用將會在下面說明。
?
下面來看下生產者代碼:
class Producer : public QThread{public:void run() override{for (int i = 0; i < DataSize; ++i) {freeBytes.acquire();buffer[i % BufferSize] = "ACGT"[QRandomGenerator::global()->bounded(4)];usedBytes.release();}}};?
從中可以看到生產者開了一個線程去操作,freeBytes.acquire()他的作用是需要獲取一個數據,當調用了這個函數后其available()的返回值,也就是資源數量就會減少1,如果調用為freeBytes.acquire(5)那么將會減少5,但是如果不夠減少,那么就不會減少,這個線程就和被掛起,等待freeBytes有數據后就會被激活。而這個usedBytes.release()會生成一個資源,也就是說usedBytes.available()其返回值會比以前加1,這里也可以填寫參數usedBytes.release(5).
?
下面是消費者代碼:
class Consumer : public QThread{Q_OBJECTpublic:void run() override{for (int i = 0; i < DataSize; ++i) {usedBytes.acquire();fprintf(stderr, "%c", buffer[i % BufferSize]);freeBytes.release();}fprintf(stderr, "\n");}};?
同樣消費者也是一個線程,usedBytes的默認的閾值為0,usedBytes.acuire()如果為0就將其阻塞掉。同樣freeBytes將會+1,這里是不會被阻塞的,能阻塞的地方只有usedBytes.acquire()。這里的阻塞用怎么的詞匯應該是掛起。
?
下面是main函數:
int main(int argc, char *argv[]){QCoreApplication app(argc, argv);Producer producer;Consumer consumer;producer.start();consumer.start();producer.wait();consumer.wait();return 0;}在main函數中有一個要注意的就是wait,使用這個可以進行等待,等生產者和消費線程完成后才會return?0;
最后生產者生產一個數據就會被使用,消費者被usedBytes信號量阻塞掛起了,生產者產生一個就和被消費。這里再給出一個程序截圖:
總結
以上是生活随笔為你收集整理的Qt文档阅读笔记-Semaphores Example解析(信号量并发实例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web前端笔记-let n = 6 -
- 下一篇: Qt笔记-当前时间转GMT并转换成英文(