2012-03-31 19 views
1

我的目標是使用線程池與pthreads,並試圖在這兩種線程模型之間進行選擇,在我看來,對等模型更適合使用固定輸入,而老闆/員工模型更適合動態更改工作項目。但是,我有點不確定如何讓對等模型與線程池一起工作。線程池 - 老闆/工人VS對等(workcrew)模型

我有一些任務需要在同一個數據集上執行。下面是我會怎麼看待解決這一一些簡單的僞代碼:

data = [0 ... 999] 
data_index = 0 
data_size = 1000 

tasks = [0 ... 99] 
task_index = 0  

threads = [0 ... 31] 

thread_function() 
{ 
    while (true) 
    { 
     index = data_index++ (using atomics) 
     if index > data_size 
     { 
      sync 

      if thread_index == 0 
      { 
       data_index = 0 
       task_index++ 
       sync 
      } 
      else 
      { 
       sync 
      } 
      continue 
     } 

     tasks[task_index](data[index]) 
    } 
} 

(首先,它好像應該把這項工作只使用一個同步點的一種方式,但我不知道這是否是可能的? )

上面的代碼看起來好像對於預先知道任務的情況很好,但我猜測對於這個特定的問題,一個線程池是不必要的。但是,即使所有任務中的數據項仍是預定義的,但如果事先未知,那麼似乎老闆/員工模型更適合?是否有可能使用老闆/員工模式,但是仍然允許線程自己提取任務(如上所述),在這種情況下,在所有任務完成之前,老闆基本上都會暫停工作? (也許這仍然稱爲對等模型?)

最後一個問題是關於同步,障礙或條件變量,爲什麼?

如果任何人可以提出任何建議,以更好地解決這個問題,甚至在我的任何假設中鑽出洞,那會很好嗎?不幸的是我受限於使用更高級別的庫,如tbb來解決這個問題。

編輯:我應該指出,如果不清楚,每個任務都需要在完成之前先完成,然後才能進入下一個任務。

+0

因此,所有線程都在不同的項目上執行相同的任務,直到數據完成,然後同步並傳遞給下一個任務? – Tudor 2012-03-31 12:17:39

+0

這是正確的。項目之間或任務之間沒有數據交換,所有事情都可以視爲獨立。 – Dan 2012-03-31 12:31:27

回答

1

我對你的描述有點困惑,希望以下是相關的。

我總是看着這個模式,發現它非常有用:「老闆」負責檢測工作並根據某種算法將其分配給工作池,從那時起,工作人員是獨立的。

在這種情況下,工作人員始終在等待工作,不知道任何其他實例,處理請求以及何時完成,可能會觸發完成通知。 這具有工作本身和線程間平衡算法之間良好分離的優點。

另一種選擇是讓「老闆」維護一個工作項目池,工作人員一有空就可以隨時拿起。但我想這實現起來比較複雜,需要更多的同步。我沒有看到第二種方法比前一種方法的好處。

控制邏輯和工人狀態在兩種情況下均由「老闆」維護。 由於並行工作是在一項任務上完成的,「boss」「object」正在處理一項任務,在一個簡單的實現中,這個「boss」阻塞,直到任務完成,允許按隊列調用下一個「boss」。

關於同步,除非我在這裏丟失了某些東西,您只需要爲所有工作人員同步一次即可完成此同步,並在工作人員只發送完成通知的「老闆」完成同步。