Qt文档阅读笔记-Semaphores Example解析(信号量并发实例)
這個例子展示了在Qt中使用多線程,在并發(fā)程序中使用QSemaphore要比QMutex高級。
這個例子是生產(chǎn)者生成數(shù)據(jù),消費者消費數(shù)據(jù),QSemaphore等同于QWaitCondition?+?QMutex。
?
下面的這些代碼中
const int DataSize = 100000;const int BufferSize = 8192; char buffer[BufferSize];QSemaphore freeBytes(BufferSize); QSemaphore usedBytes;?
這里的DataSize是循環(huán)的總次數(shù),freeBytes(BufferSize)是指目前freeBytes的閾值為8192,而usedBytes的閾值為0,這個閾值的作用將會在下面說明。
?
下面來看下生產(chǎn)者代碼:
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();}}};?
從中可以看到生產(chǎn)者開了一個線程去操作,freeBytes.acquire()他的作用是需要獲取一個數(shù)據(jù),當調(diào)用了這個函數(shù)后其available()的返回值,也就是資源數(shù)量就會減少1,如果調(diào)用為freeBytes.acquire(5)那么將會減少5,但是如果不夠減少,那么就不會減少,這個線程就和被掛起,等待freeBytes有數(shù)據(jù)后就會被激活。而這個usedBytes.release()會生成一個資源,也就是說usedBytes.available()其返回值會比以前加1,這里也可以填寫參數(shù)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()。這里的阻塞用怎么的詞匯應(yīng)該是掛起。
?
下面是main函數(shù):
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函數(shù)中有一個要注意的就是wait,使用這個可以進行等待,等生產(chǎn)者和消費線程完成后才會return?0;
最后生產(chǎn)者生產(chǎn)一個數(shù)據(jù)就會被使用,消費者被usedBytes信號量阻塞掛起了,生產(chǎn)者產(chǎn)生一個就和被消費。這里再給出一個程序截圖:
總結(jié)
以上是生活随笔為你收集整理的Qt文档阅读笔记-Semaphores Example解析(信号量并发实例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web前端笔记-let n = 6 -
- 下一篇: Qt笔记-当前时间转GMT并转换成英文(