簡體   English   中英

同步工作線程

[英]Synchronizing worker threads

我有一個方案,我試圖提出最好的同步方法。 我們假設存在C ++ 11中的std :: thread,因此無需擔心各種線程庫之間的差異等。

情景是這樣的。 線程a,主線程,想要將任務分發給一堆工作線程。 然后,在暫時發出最終指令后,需要等待所有線程完成其工作。 我們不想加入他們,只是等待他們完成他們的任務。 然后線程a必須分析來自所有線程的收集數據,然后向工作人員發送命令以再次開始該過程。

簡而言之,這些是步驟。

  1. 將發送命令x線程化到所有工作線程。
  2. 線程一直等到所有工人都完成了。
  3. 線程a做處理。
  4. 回到1。

你會建議我用什么? 簡單的互斥? 條件變量? 兩者的結合? 關於如何使同步結構盡可能高效的任何提示都將受到贊賞。

您有n個工作線程和一個主線程a ,它將任務委派給工作人員,並且必須等待他們完成這些任務,然后再為他們分配一批新任務。

基本技術是使用屏障(如boost::barrier )來同步工作線程的結束和a

屏障在n+1處初始化。 主線程a等待的障礙,每個工作線程做同樣的在其任務結束。 當最后一個線程在屏障上調用wait時,所有線程都被喚醒,主線程可以繼續工作。 您可能希望添加第二個屏障來阻止工作線程,直到為其分配新任務。

工作線程的主體可能看起來像以下偽代碼:

while (running) {
     startbarrier.wait(); // wait for main thread to signal start
     do_work();
     endbarrier.wait(); // signal end of work
 }

使用信號量也可以實現相同的功能。 信號量和屏障都可以使用互斥鎖和條件變量來實現。

有關詳細信息,請參閱此SO問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM