gpt4 book ai didi

c++ - 在线程池中组织任务

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:47 25 4
gpt4 key购买 nike

这是一个设计而不是代码相关的问题。它涉及线程池,特别是如何组织任务的执行。我在跨平台场景中使用 C++ 和 Boost 线程。

我有几组任务需要并行化。 X 个组触发 x 个子任务。必须完成所有子任务才能让一个组依次完成,但是子任务的完成顺序无关紧要,只要该组可以确定属于它的所有子任务何时完成即可。主线程必须等待所有组以类似于组等待其子任务的方式完成。换句话说,只要主线程可以确定它们何时全部完成,以什么顺序完成组并不重要。

换句话说:

  1. 所有小组都等待各自的子任务完成。子任务的完成顺序并不重要,只要小组能够弄清楚它们何时全部完成即可。

  2. 主线程等待所有组完成。它们完成的顺序并不重要,只要主线程可以检测到所有组何时完成即可。换句话说,它与组特定子任务的概念完全相同。

所有这一切都必须通过池中的 N 个线程完成,再加上主线程,因此总共有 N+1 个线程。 N 必须可配置为任意值。

如果有帮助的话,任务只是一个需要从 N 个线程之一调用的函数。

有人对我如何实现它有任何建议吗?

最佳答案

创建两个类:

  • CThreadGroup:启动多个线程并等待它们完成(使用连接)。
  • CMainThread:启动一系列此类 (CThreadGroup) 并等待它们完成(使用连接)。将要启动的 CThreadGroup 数量和 CThreadGroup 启动的子线程数作为输入输出参数

在main中声明一个CMainThread类型的对象。

这是类的原型(prototype):

主线程

#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();
}
}

希望对你有帮助,

关于c++ - 在线程池中组织任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com