2013-07-07 102 views
1

這是一個設計而不是代碼相關的問題。它涉及線程池,特別是如何組織任務的執行。我在跨平臺場景中使用C++和Boost線程。我需要並行化的任務組。 X組數量x消除了x個子任務。必須完成所有子任務才能讓一個組完成,但只要該組可以確定屬於該子任務的所有子任務何時完成,子任務的完成順序無關緊要。主線程必須等待所有組以與組的等待子任務類似的方式完成。換句話說,只要主線程能夠確定他們什麼時候完成,這些組的完成順序並不重要。在線程池中組織任務

爲了把它用不同的方式:

  1. 所有組等待他們各自的子任務來完成。只要小組完成任務,子任務按什麼順序完成並不重要。

  2. 主線程等待所有組完成。只要主線程能夠檢測到所有組完成時,它們以什麼順序完成並不重要。換句話說,它與羣組特定的子任務具有完全相同的概念。

所有這些都必須由一個池中的N個線程加上主線程來完成,因此總共需要N + 1個線程。 N必須可配置爲任意值。

如果有幫助,任務只是一個需要從N個線程之一調用的函數。

有沒有人有任何提示,我可能會實現這個?

+0

哪些線程在做什麼?他們是否得到自己的一塊數據來處理數據,還是共享數據? –

+0

子任務在給定組內是獨立的,並且這些組獨立於其他組。 –

+0

爲了澄清,任務僅僅是一個需要執行的功能,所以我想我會對它們進行排隊。該隊列必須是線程安全的,我必須弄清楚如何確定屬於某個組的所有任務何時完成,以及何時完成所有組。 –

回答

0

創建兩個類:

  • CThreadGroup:啓動一個線程數和等待他們(使用連接)完成。
  • CMainThread:啓動一系列此類(CThreadGroup)並等待它們完成(使用連接)。作爲inout參數啓動CThreadGroup的數量以及啓動多少個子線程CThreadGroup

在main中聲明CMainThread類型的一個對象。

這裏是類的原型:

主線程

#include "ThreadGroup.h" 
#include <mutex> 
class CMainThread 
{ 
    std::vector<CThreadGroup> vThreadGroups; 
    std::vector<std::thread> vThreads; 
    const unsigned int nbMainThreads; 
    const unsigned int nbSubthreads; 

public: 
    CMainThread(unsigned int nbMainThreads, 
       unsigned int nbSubthreads); 
    ~CMainThread(void); 
}; 


#include <thread> 
#include <vector> 
class CThreadGroup 
{ 
    const unsigned int nbThreads; 
public: 
    CThreadGroup(unsigned int nbThreads); 
    ~CThreadGroup(void); 
}; 

線程組

#include <thread> 
#include <vector> 
class CThreadGroup 
{ 
    const unsigned int nbThreads; 
public: 
    CThreadGroup(unsigned int nbThreads); 
    ~CThreadGroup(void); 
}; 

這裏是cpp文件

CMainThread::CMainThread(unsigned int nbMainThreads_, 
         unsigned int nbSubthreads_): 
nbMainThreads(nbMainThreads_), 
nbSubthreads(nbSubthreads_) 
{ 
    std::mutex mut; 
    for (unsigned int i=0;i<nbMainThreads;++i) 
    { 
     vThreads.push_back(std::thread([&]{ 
      CThreadGroup currThread(nbSubthreads); 
      std::lock_guard<std::mutex> lock(mut); 
      vThreadGroups.push_back(currThread); 
     })); 
    } 

    for (auto it=vThreads.begin(); it!=vThreads.end(); ++it) 
    { 
     it->join(); 
    } 
} 

線程組

CThreadGroup::CThreadGroup(unsigned int nbThreads_): 
nbThreads(nbThreads_) 
{ 
    std::vector<std::thread> vThreads; 
    for (unsigned int i=0;i<nbThreads;++i) 
    { 
     vThreads.push_back(std::thread([i]{std::this_thread::sleep_for(std::chrono::seconds(i));})); 
    } 

    for (auto it=vThreads.begin(); it!=vThreads.end(); ++it) 
    { 
     it->join(); 
    } 
} 

希望幫助,