c++ qt获取电脑的内存_Qt官方示例信号量
演示Qt多線程的信號量操作編程。
???生產者將數據寫入緩沖區,直到到達緩沖區末尾為止,然后從頭開始重新開始,覆蓋現有數據。使用者線程讀取生成的數據,并將其寫入標準錯誤。
??信號量比互斥量可以具有更高的并發級別。如果對緩沖區的訪問由QMutex保護,則使用者線程無法與生產者線程同時訪問緩沖區。但是,使兩個線程同時在緩沖區的不同部分上工作并沒有什么害處。
??該示例包括兩個類:Producer和Consumer。兩者都繼承自QThread。用于在這兩個類之間進行通信的循環緩沖區以及保護它的信號量是全局變量。
??使用QSemaphore解決生產者-消費者問題的替代方法是使用QWaitCondition和QMutex。如需看更多請查看Qt的"Wait Conditions Example"示例。
全局變量
??讓我們從回顧循環緩沖區和相關的信號量開始:
const?int?DataSize?=?100000;const?int?BufferSize?=?8192;
char?buffer[BufferSize];
QSemaphore?freeBytes(BufferSize);
QSemaphore?usedBytes;
??DataSize是生產者將生成的大量數據。為了使示例盡可能簡單,我們將其設為常量。BufferSize是循環緩沖區的大小。它小于DataSize,表示生產者將在某個時候到達緩沖區的末尾并從頭開始重新啟動。
??為了使生產者和消費者同步,我們需要兩個信號量。該freeBytes信號控制緩沖的"自由"區域(該區域的生產者還沒有裝滿數據或消費者已經讀取了)。useBytes信號量控制緩沖區的"已用"區域(生產者已填充但使用者尚未讀取的區域)。
??信號量共同確保了生產者在使用方之前不會超過BufferSize字節,并且確保使用方從未讀取過生產者尚未生成的數據。
??freeBytes信號量使用BufferSize初始化,因為最初整個緩沖區為空。useBytes信號量初始化為0(如果未指定默認值)。
生產者類
??讓我們回顧一下Producer該類的代碼:
class?Producer?:?public?QThread{
public:
????void?run()?override{
????????for?(int?i?=?0;?i?????????????freeBytes.acquire();
????????????buffer[i?%?BufferSize]?=?"ACGT"[QRandomGenerator::global()->bounded(4)];
????????????usedBytes.release();
????????}
????}
};
??生產者生成DataSize字節數據。在將字節寫入循環緩沖區之前,它必須使用freeBytes信號量獲取"空閑"字節。如果消費者沒有跟上生產者的步伐,調用QSemaphore::acquire()將會在這里阻塞。
??最后,生產者使用usedBytes信號量釋放一個字節。"空閑"字節已成功轉換為"已使用"字節,供消費者讀取。
消費者類
??現在轉到Consumer類:
class?Consumer?:?public?QThread{
????Q_OBJECT
public:
????void?run()?override{
????????for?(int?i?=?0;?i?????????????usedBytes.acquire();
????????????fprintf(stderr,?"%c",?buffer[i?%?BufferSize]);
????????????freeBytes.release();
????????}
????????fprintf(stderr,?"\n");
????}
};
現在轉到Consumer類:
class?Consumer?:?public?QThread{
????Q_OBJECT
public:
????void?run()?override{
????????for?(int?i?=?0;?i?????????????usedBytes.acquire();
????????????fprintf(stderr,?"%c",?buffer[i?%?BufferSize]);
????????????freeBytes.release();
????????}
????????fprintf(stderr,?"\n");
????}
};
??該代碼與生產者非常相似,除了這次我們獲得一個"已用"字節并釋放一個"空閑"字節,而不是相反。
main函數
??在main函數中,我們創建兩個線程并調用QThread::wait()以確保兩個線程在退出之前都有時間完成:
int?main(int?argc,?char?*argv[]){????QCoreApplication?app(argc,?argv);
????Producer?producer;
????Consumer?consumer;
????producer.start();
????consumer.start();
????producer.wait();
????consumer.wait();
????return?0;
}
??那么當我們運行程序時會發生什么呢?最初,生產者線程是唯一可以做任何事情的線程。消費者被阻止等待usedBytes信號量被釋放(其初始available()計數為0)。一旦生產者將一個字節放入緩沖區中,freeBytes.available()即BufferSize-1和usedBytes.available()等于1。此時,可能會發生兩件事:消費者線程接管并讀取該字節,或者生產者線程獲得第二個字節。
??本示例中提供的生產者-消費者模型使編寫高度并發的多線程應用程序成為可能。在多處理器計算機上,該程序的運行速度可能是等效的基于互斥鎖的程序的兩倍,因為兩個線程可以同時在緩沖區的不同部分處于活動狀態。
??「請注意」,盡管并非總是能實現這些好處的。獲取和釋放 QSemaphore 需要花費成本。實際上,將緩沖區劃分為塊并操作塊而不是單個字節可能是值得的。緩沖區大小也是必須根據實驗仔細選擇其參數。
關于更多
在「QtCreator軟件」可以找到:
或在以下「Qt安裝目錄」找到:
- 「相關鏈接」
 
- Qt君公眾號回復『Qt示例』獲取更多內容。
 
總結
以上是生活随笔為你收集整理的c++ qt获取电脑的内存_Qt官方示例信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: php mysql explain_My
 - 下一篇: protobuf数据类型_protobu