2011-07-11 27 views
0

正如已經在標題中所述,我有大量的線程(可能遠遠高於100),而不是運行程序狀態。我只需要其中的幾個(足以使用所有物理處理器)來真正運行併發,其餘的應該等到其中一個運行被阻塞。發生這種情況時,應該運行一個新的。調度大量的線程,所以只有4個並行執行

是否有可能通過pthread例如pthread調度功能來實現這一點?你會如何做到這一點?

問候,

沒有人

編輯 更多信息: 每個線程從自身的taskpool獲取一份工作,去到某一點。 我需要100個線程來收集那些無法並行計算的程序執行點。計算完成後,線程應該被喚醒並繼續。爲了使這一有效的我必須避免浪費時間在100個線程之間進行切換,而不是4

+0

你或許應該解釋一下爲什麼你需要的線程100S,而不是4個線程,其執行的線程池。 –

+0

我不得不將其包含在框架中而不改變其結構。我可以將它編程爲只有4個線程,但是這會改變整個框架。所以我找到的唯一解決方案就是擁有那麼多通過框架的線程,並在收集點停下來。 – Nobody

+0

您是否知道Python的Global Interpreter Lock?無論計算機中的物理處理器或內核的數量如何,它都可以一次阻止多個線程同時訪問Python對象。這發生在線程和信號量之下的某個級別。 – sizzzzlerz

回答

0

你總是可以在同一時間推出4,將其分配給一個線程組,然後等待一個加入所有的調度線程組。但我認爲需要更多的信息來開發真正有用的答案。

0
  • 初始化一個全局變量的線程數同時運行。
  • 當一個線程想要工作時,它會獲得一個插槽。使用互斥鎖和條件變量,它會一直等到slots_available> 1,然後遞減slots_available釋放互斥鎖並繼續其工作。
  • 當線程完成其工作時,它通過鎖定互斥鎖並增加slots_available來釋放插槽。它標誌着所有線程等待條件變量,使他們能夠醒來,看是否slots_available> 1.
  • 特定的並行線程庫見https://computing.llnl.gov/tutorials/pthreads/#Mutexes調用使用上述。
+0

聽起來像模擬信號量? – Nobody

+0

同意,但請注意,pthreads不提供信號量實現,但它確實提供了互斥和條件變量。 –

0

我不知道如何與並行線程功能做到這一點,但我有一個想法:

我會加入一些智能線程池/ taskpool實現這個計算活動線程的數量並且只能在任何時候使4個活動線程可用。這可以通過有一個空閒隊列,一個就緒隊列和一個活動隊列(或者只是活動計數)來完成。任務會從就緒隊列中抓取,線程池只會有條件地將任務從空閒隊列遷移到就緒隊列。

相關問題