2009-02-17 24 views
3

我需要並行化一個簡單的密碼破解程序,以便在n處理器系統上使用它。我的想法是創建n個線程,並在他們完成時爲他們提供越來越多的工作。pthreads - 如何並行化作業

什麼是知道線程何時完成的最佳方式?互斥體?在其他線程正在運行時不會經常檢查此互斥鎖嗎?

+1

這個n處理器系統會成爲Confiker僵屍網絡嗎? – 2009-02-17 22:44:59

+0

呃,不...暫時,n = 2 ;-)也許將來! – zakk 2009-02-17 23:01:09

回答

5

您可以擁有一個簡單的隊列結構 - 使用您喜歡的任何數據結構 - 然後在添加/刪除項目時使用互斥鎖。

如果你的線程抓住了他們需要在足夠大的「塊」中完成的工作,那麼對互斥體的爭用就會很少,所以開銷很小。例如,如果每個線程一次抓取大約1秒的工作並獨立工作1秒,那麼對互斥鎖的操作將非常少。

當他們沒有更多的工作時,線程可以退出;主線程可以使用pthread_join等待。

1

使用線程之間的消息隊列: -

主 - >進程(說去與此)。 Process - > Master(說我完成了 - 給我更多,或者,我找到了結果!)

使用此方法,線程只在系統執行時關閉 - 否則它正在處理數據或等待在消息隊列上。

通過這種方式,MCP(我一直想這麼說!)只是將消息和手作業處理到正在等待更多工作的線程。

這可能會更有效率,創建和銷燬線程的所有時間。

1

通常情況下,您使用「條件變量」來處理這種情況,您想等待異步作業完成。

條件變量基本上是受互斥體保護的簡單信號。 Pthread具有條件變量(請參閱例如pthread_cond_create(...)函數)。