91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

QT 信號量QSemaphore的使用

發布時間:2020-07-23 23:12:19 來源:網絡 閱讀:3064 作者:WZM3558862 欄目:開發技術
生產者——消費者模型中,生產者和消費者線程之間需要傳遞一定量的數據,兩個線程會使用一個特定大小的共享環形緩沖器。
生產者向緩沖器中寫入數據,直到它到達緩沖器的終點;然后它會再次從起點重新開始,覆蓋已經存在的數據。消費者線程則會讀取生成的數據。
在生產者——消費者實例中,對于同步的需求有兩個部分:如果生產者線程生成數據的速度太快,那么將會把消費者線程還沒有讀取的數據覆蓋;如果消費者線程讀取數據的速度過快,那么它就會越過生產者線程而讀取一些垃圾數據。
解決這一問題的一個粗略方法是,讓生產者線程填滿緩沖器,然后等待消費者線程讀取完緩沖器中全部速度。
另一個更有效的方案是使用兩個信號量。
freeSpace信號量控制生產者線程寫入數據的那部分緩沖器,usedSpace信號量則控制消費者線程讀取數據的那部分緩沖器區域。這兩個區域是相互補充的。常用緩沖區容量值初始化freeSpace信號量,意味著它最多可以獲取的緩沖器資源量。在啟動這個應用程序時,消費者線程就會獲得自由的字節并把它們轉換為用過的字節。用0初始化usedSpace信號量,以確保消費者線程不會在一開始就讀取到垃圾數據。
在生產者線程中,每次反復寫入都是從獲取一個自由字節開始。如果該緩沖器中充滿了消費者線程還沒有讀取的數據,那么對acquire()的調用就會被阻塞,直到消費者線程開始消費這些數據。一旦生產者線程獲取這一字節,就寫入數據,并將這個字節釋放為用過的字節,以讓消費者線程讀取到。
在消費者線程中,我們從獲取一個用過的字節開始。如果緩沖器中還沒有任何可用的數據,那么將會阻塞對acquire()調用,直到生產者線程生產數據。一旦獲取到這個字節,就使用數據,并把字節釋放為自由的字節,這樣,生產者線程就可以再次寫入。

生產者把自由的空間轉換為用過的空間,消費者將用過的空間轉換為自由的空間。

 

[cpp] view plain copy QT 信號量QSemaphore的使用QT 信號量QSemaphore的使用

  1. /************************************** 

  2. *說明:生產者——消費者線程模型 

  3. ***************************************/  

  4. #include <QtCore/QCoreApplication>  

  5. #include <QSemaphore>  

  6. #include <QThread>  

  7. #include <stdio.h>  

  8. //  

  9. QSemaphore usedSem(0);//已用量  

  10. QSemaphore unusedSem(4096);//未使用變量  

  11. unsigned int buffer[4096];//緩沖區  

  12. //生產者線程  

  13. class producer:public QThread  

  14. {  

  15. public:  

  16.     producer();  

  17. private:  

  18.     void run();  

  19. };  

  20. producer::producer()  

  21. {  

  22.     ;  

  23. }  

  24. //  

  25. void producer::run()  

  26. {  

  27.     int i=0;  

  28.     for(i=0;i<10000;i++)  

  29.     {  

  30.         unusedSem.acquire();//空閑信號量減1  

  31.         buffer[i%4096]=i;  

  32.         usedSem.release();//已用信號量加1  

  33.     }  

  34. }  

  35. //消費者線程  

  36. class customer:public QThread  

  37. {  

  38. public:  

  39.     customer();  

  40. private:  

  41.     void run();  

  42. };  

  43. customer::customer()  

  44. {  

  45.     ;  

  46. }  

  47.   

  48. void customer::run()  

  49. {  

  50.     int i=0;  

  51.     for(i=0;i<10000;i++)  

  52.     {  

  53.         usedSem.acquire();//已用信號量減1  

  54.         printf("%d\n",buffer[i%4096]);  

  55.         unusedSem.release();//空閑信號量加1  

  56.     }  

  57. }  

  58.   

  59. //  

  60. int main(int argc, char *argv[])  

  61. {  

  62.     QCoreApplication a(argc, argv);  

  63.     //  

  64.     producer producerThread;  

  65.     customer customerThread;  

  66.     //  

  67.     producerThread.start();  

  68.     customerThread.start();  

  69.     //  

  70.     producerThread.wait();  

  71.     customerThread.wait();  

  72.     //  

  73.     return a.exec();  

  74. }  


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

闽侯县| 乌拉特后旗| 嘉黎县| 乌鲁木齐县| 灵川县| 临武县| 蕲春县| 蓬莱市| 常山县| 兰西县| 察雅县| 桓台县| 资讯| 巴东县| 陕西省| 普格县| 吴桥县| 西昌市| 东辽县| 于都县| 临洮县| 高阳县| 石台县| 文成县| 京山县| 郸城县| 新泰市| 驻马店市| 镇江市| 磐安县| 东阳市| 东丽区| 凤山市| 嵩明县| 富锦市| 宿松县| 曲阜市| 都昌县| 宜丰县| 松桃| 长泰县|