这是一个设计而不是与代码相关的问题。它涉及线程池,特别是如何组织任务的执行。我在跨平台场景中使用C ++和Boost线程。
我需要并行化的任务组。 X个组触发x个子任务。必须完成所有子任务才能使一个组轮流完成,但只要该组可以确定属于它的所有子任务何时完成,子任务的完成顺序无关紧要。主线程必须等待所有组以与组等待其子任务的方式类似的方式完成。换句话说,只要主线程可以确定它们何时完成,组的完成顺序并不重要。
换句话说:
所有组等待各自的子任务完成。只要小组能够弄清楚它们何时全部完成,那么子任务的顺序并不重要。
主线程等待所有组完成。只要主线程可以检测到所有组何时完成,它们以何种顺序完成并不重要。换句话说,它与组特定子任务的概念完全相同。
所有这一切必须在池中的N个线程加上主线程完成,所以总共N + 1个线程。 N必须可配置为任意值。
如果有帮助,任务只是一个需要从N个线程之一调用的函数。
有没有人对我如何实现这个有任何提示?
答案 0 :(得分:0)
创建两个类:
在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();
}
}
希望有所帮助,