日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt文档阅读笔记-Semaphores Example解析(信号量并发实例)

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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解析(信号量并发实例)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。