2013-11-23 171 views
3

我有一個程序,不斷得到一些工作要做(像服務器的東西),並且線程少。哪種方法可以重用pthread庫中的線程?或者我每次都被迫創建一個新的線程。我想重複使用至少pthread_t結構。我想這樣的事情:重用線程pthread

int main() { 
    pthread_t threads[some value]; 
    while (1) { 
     get work; 
     find a free thread; 
     pthread_create(free thread, do work); 
     pthread_join(done threads); 
    } 

但我不知道如何正確地釋放線程或如何檢查它是否是免費的。

+0

您是否考慮了線程構建模塊(TBB)? – Adam

回答

8

只需編寫線程即可完成任何需要完成的工作。不要繼續創建和加入線程。最簡單的方法是使用thread pool - 一組線程和一個線程安全的作業隊列。池中的每個線程都從隊列中取出作業,完成該作業,然後等待另一個作業。

對於POSIX線程,通常使用互斥鎖來保護隊列和條件變量,以允許線程等待工作。您可能需要一個布爾變量來跟蹤程序是否正在關閉。

在僞代碼中,每個線程執行此:

  1. 獲取互斥體。
  2. 檢查程序是否正在關閉,如果是,釋放互斥並終止。
  3. 檢查隊列是否爲空。如果是,請阻止條件變量並轉到步驟2.
  4. 從隊列中取出最高職位。
  5. 釋放互斥鎖。
  6. 做這項工作。
  7. 轉到步驟1

要問一個線程做的工作,做到這一點:

  1. 分配一個新的工作對象。
  2. 用待完成的工作填充它(可以是指向該函數的函數和參數的指針)。
  3. 獲取互斥量。
  4. 將作業添加到隊列中。
  5. 發出條件變量。
  6. 釋放互斥鎖。

要關閉:

  1. 獲取互斥體。
  2. 將關閉布爾值設置爲true。
  3. 廣播條件變量。
  4. 釋放互斥鎖。
  5. 加入所有主題。
+0

這比我想到的更有意義。我以錯誤的方式看待這個問題。感謝你的回答。 – Jelly

+0

如果您正在尋找參考實現,請查看[this](https://github.com/jonhoo/pthread_pool)。 –