Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在线程池中组织任务_C++_Multithreading_Boost_Threadpool - Fatal编程技术网

C++ 在线程池中组织任务

C++ 在线程池中组织任务,c++,multithreading,boost,threadpool,C++,Multithreading,Boost,Threadpool,这是一个设计问题,而不是与代码相关的问题。它涉及线程池,特别是如何组织任务的执行。我在一个跨平台的场景中使用C++和Boost线程。 我有一组需要并行处理的任务。X触发的组数X子任务数。必须完成所有子任务才能使组依次完成,但子任务的完成顺序并不重要,只要组可以确定属于它的所有子任务何时完成。主线程必须以与组等待其子任务的方式类似的方式等待所有组完成。换句话说,只要主线程能够确定组完成的时间,那么组完成的顺序并不重要 换言之: 所有组都等待各自的子任务完成。子任务完成的顺序并不重要,只要小组能够确

这是一个设计问题,而不是与代码相关的问题。它涉及线程池,特别是如何组织任务的执行。我在一个跨平台的场景中使用C++和Boost线程。 我有一组需要并行处理的任务。X触发的组数X子任务数。必须完成所有子任务才能使组依次完成,但子任务的完成顺序并不重要,只要组可以确定属于它的所有子任务何时完成。主线程必须以与组等待其子任务的方式类似的方式等待所有组完成。换句话说,只要主线程能够确定组完成的时间,那么组完成的顺序并不重要

换言之:

所有组都等待各自的子任务完成。子任务完成的顺序并不重要,只要小组能够确定它们何时全部完成

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

所有这些都必须使用池中的N个线程加上主线程来完成,因此总共有N+1个线程。N必须可配置为任意值

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

有人知道我如何实现这一点吗?

创建两个类:

CThreadGroup:启动多个线程并等待它们完成使用join。 CMainThread:启动一系列此类CThreadGroup,并等待它们完成使用join。将要启动的CThreadGroup的数量和启动的子线程CThreadGroup的数量作为inout参数 在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);
};
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();
    } 
}
这是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();
    }
} 
螺纹组

#include <thread>
#include <vector>
class CThreadGroup
{
    const unsigned int nbThreads;
public:
    CThreadGroup(unsigned int nbThreads);
    ~CThreadGroup(void);
};
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();
    } 
}

希望有帮助,

线程在做什么?他们是否有自己的数据要处理,或者数据是共享的?子任务在给定的组中是独立的,组与其他组是独立的。为了澄清,任务只是一个需要执行的函数,所以我想我会将它们排成一个队列。该队列必须是线程安全的,我必须弄清楚如何确定属于某个组的所有任务何时完成,以及所有组何时完成。我会让完成时的任务向分组线程发送一个信号,当所有任务完成时,分组线程向主线程发送一个信号。然后您可以声明一个工作线程任务线程作为小组组长。