我的目標是使用線程池與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來解決這個問題。
編輯:我應該指出,如果不清楚,每個任務都需要在完成之前先完成,然後才能進入下一個任務。
因此,所有線程都在不同的項目上執行相同的任務,直到數據完成,然後同步並傳遞給下一個任務? – Tudor 2012-03-31 12:17:39
這是正確的。項目之間或任務之間沒有數據交換,所有事情都可以視爲獨立。 – Dan 2012-03-31 12:31:27