C++ boost::线程组-在加入所有线程后调用create\u线程可以吗?

C++ boost::线程组-在加入所有线程后调用create\u线程可以吗?,c++,parallel-processing,boost-thread,C++,Parallel Processing,Boost Thread,我有以下情况: 我创建了一个boost::thread\u组实例,然后创建线程对一些数据进行并行处理,然后在线程上加入所有线程 最初,我为数据的每个X元素创建了线程,如下所示: // begin = someVector.begin(); // end = someVector.end(); // batchDispatcher = boost::function<void(It, It)>(...); boost::thread_group processors; //

我有以下情况:

我创建了一个boost::thread\u组实例,然后创建线程对一些数据进行并行处理,然后在线程上加入所有线程

最初,我为数据的每个X元素创建了线程,如下所示:

// begin = someVector.begin();
// end = someVector.end();
// batchDispatcher = boost::function<void(It, It)>(...);

boost::thread_group     processors;

// create dispatching thread every ASYNCH_PROCESSING_THRESHOLD notifications
while(end - begin > ASYNCH_PROCESSING_THRESHOLD)
{
    NotifItr split = begin + ASYNCH_PROCESSING_THRESHOLD;

    processors.create_thread(boost::bind(batchDispatcher, begin, split));
    begin = split;
}

// create dispatching thread for the remainder
if(begin < end)
{
    processors.create_thread(boost::bind(batchDispatcher, begin, end));
}

// wait for parallel processing to finish
processors.join_all();

无论谁对此有经验,谢谢你的洞察力。

我认为这是不可能的。您想要的解决方案实际上可能是实现一个或一个主辅助线程(主“主”线程将工作划分为几个固定大小的任务,创建“辅助”线程池,并向每个辅助线程发送一个任务,直到所有任务完成)

这些解决方案将需要通过信号量进行一些同步,但它们将很好地平衡性能—您可以为机器中的每个可用核心创建一个线程,从而避免在上下文切换上浪费时间


另一个不太好和新奇的选择是一次连接一个线程。您可以拥有一个包含4个活动线程的向量,连接一个线程并创建另一个线程。这种方法的问题是,如果任务是异构的,可能会浪费处理时间。

我认为这是不可能的。您想要的解决方案实际上可能是实现一个或一个主辅助线程(主“主”线程将工作划分为几个固定大小的任务,创建“辅助”线程池,并向每个辅助线程发送一个任务,直到所有任务完成)

这些解决方案将需要通过信号量进行一些同步,但它们将很好地平衡性能—您可以为机器中的每个可用核心创建一个线程,从而避免在上下文切换上浪费时间


另一个不太好和新奇的选择是一次连接一个线程。您可以拥有一个包含4个活动线程的向量,连接一个线程并创建另一个线程。这种方法的问题是,如果您的任务是异构的,您可能会浪费处理时间。

代码按原样工作(如在我建议的解决方案中),但我不确定它是否稳定。我已经实现了一个版本,在join_all之后显式删除死线程。这不是最有效的实现,但现在可以(如这里所建议的:)我还将研究实现生产者-消费者解决方案(谢谢)。代码按原样工作(如我建议的解决方案),但我不确定它是否稳定。我已经实现了一个版本,在join_all之后显式删除死线程。这并不是最有效的实现,但现在就可以了(正如这里所建议的那样:)我还将研究实现生产者-消费者解决方案(谢谢)。
boost::thread_group     processors;
size_t                  processorThreads = 0; // NEW CODE

// create dispatching thread every ASYNCH_PROCESSING_THRESHOLD notifications
while(end - begin > ASYNCH_PROCESSING_THRESHOLD)
{
    NotifItr split = begin + ASYNCH_PROCESSING_THRESHOLD;

    processors.create_thread(boost::bind(batchDispatcher, begin, split));
    begin = split;

    if(++processorThreads >= MAX_ASYNCH_PROCESSORS) // NEW CODE
    {                               // NEW CODE
        processors.join_all();      // NEW CODE
        processorThreads = 0;       // NEW CODE
    }                               // NEW CODE
}

// ...