2013-07-07 65 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(); 
    } 
} 

希望帮助,