2011-12-23 93 views
1

我最近開始嘗試使用pseudo-boost threadpool(僞,因爲它尚未被官方接受)。使用處理IO隊列的線程來提升線程池

作爲一個簡單練習,我初始化了線程池,最多使用兩個線程

每個任務都做了兩兩件事:

  • 一個CPU密集型計算
  • 寫出來的結果到磁盤

問題

如何修改模型爲threadpool那麼做:

  • 一個CPU密集型計算

並監聽來自線程池完成一個單個I/O線程 - 使所得的存儲器和簡單地:

  • 寫出的結果到磁盤

如果我只是有任務傳達給I/O線(催生 作爲std ::線程)通過一個std :: condition_variable(實質上是一個計算結果的互斥隊列)還是有一種方法來 在線程池庫內做到這一切?

或者是gcc 4.6.1的實現futurepromise成熟到足以讓我把這個關掉?

回答

它看起來像一個簡單的mutex queue with a condition variable工作正常。

通過分組的讀訪問和寫入,除了使用線程池,我得到了以下改進:

  • 2芯機:1h14m降至33米(在運行時間減少46%)
  • 4芯VM:40米下降18米(在運行時減少55%)

由於馬丁詹姆斯他深思熟慮的答案。在這個練習之前,我認爲我的下一個計算服務器應該有雙處理器和大量的內存。但是現在,由於多核心和超線程所具有的處理能力如此之強,我意識到資金可能會更好地處理I/O瓶頸問題。

正如馬丁所說,擁有多個驅動器或RAID配置可能會有所幫助。我還將着眼於調整內核級別的I/O緩衝區設置。

回答

2

如果只有一個本地磁盤,生產者 - 消費者隊列末尾的一個寫入器線程將是我的最愛。尋求,網絡磁盤延遲和其他打嗝不會留下任何線索,他們的計算被困在試圖寫入磁盤的過程中。其他磁盤操作(例如,選擇另一個位置/文件/文件夾),如果只有一個線程正在訪問它,也更容易/更快 - 隊列將佔用冗餘並允許在延遲期間進行無縫計算。

直接從calcualtion任務寫入或將結果寫入作爲單獨的任務提交將可以正常工作,但您需要更多線程才能實現無暫停操作。

如果有多個磁盤,一切都會改變。由於整體性能的提高,不止一個作家線程將成爲一個有價值的主張。然後我可能會使用一個數組/列表/寫入線程,每個磁盤一個。