我最近開始嘗試使用pseudo-boost threadpool(僞,因爲它尚未被官方接受)。使用處理IO隊列的線程來提升線程池
作爲一個簡單練習,我初始化了線程池,最多使用兩個線程。
每個任務都做了兩兩件事:
- 一個CPU密集型計算
- 寫出來的結果到磁盤
問題
如何修改模型爲threadpool那麼做:
- 一個CPU密集型計算
並監聽來自線程池完成一個單個I/O線程 - 使所得的存儲器和簡單地:
- 寫出的結果到磁盤
如果我只是有任務傳達給I/O線(催生 作爲std ::線程)通過一個std :: condition_variable(實質上是一個計算結果的互斥隊列)還是有一種方法來 在線程池庫內做到這一切?
或者是gcc 4.6.1的實現
future
和promise
成熟到足以讓我把這個關掉?
回答
它看起來像一個簡單的mutex queue with a condition variable工作正常。
通過分組的讀訪問和寫入,除了使用線程池,我得到了以下改進:
- 2芯機:1h14m降至33米(在運行時間減少46%)
- 4芯VM:40米下降18米(在運行時減少55%)
由於馬丁詹姆斯他深思熟慮的答案。在這個練習之前,我認爲我的下一個計算服務器應該有雙處理器和大量的內存。但是現在,由於多核心和超線程所具有的處理能力如此之強,我意識到資金可能會更好地處理I/O瓶頸問題。
正如馬丁所說,擁有多個驅動器或RAID配置可能會有所幫助。我還將着眼於調整內核級別的I/O緩衝區設置。