我有以下情况:
我创建一个boost :: thread_group实例,然后为某些数据创建并行处理的线程,然后在线程上创建join_all。
最初我为每个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();
但是我有一个问题:当我有大量数据时,这段代码会产生大量线程(> 40个线程),这使得处理器忙于线程切换上下文。
我的问题是:在调用join_all之后,是否可以在thread_group 上调用create_thread。
也就是说,我可以将代码更改为此吗?
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
}
// ...
有任何经验的人,感谢您的任何见解。
答案 0 :(得分:1)
我相信这是不可能的。您想要的解决方案实际上可能是实现producer-consumer或主工作者(主'主'线程将工作分成几个固定大小的任务,创建'工作者'线程池并向每个工作人员发送一个任务,直到所有任务都完成了)。
这些解决方案将要求通过信号量进行一些同步,但它们将很好地平衡性能,您可以为机器中的每个可用核心创建一个线程,从而避免浪费上下文切换的时间。
另一个不那么好看的选择是一次加入一个线程。你可以有一个包含4个活动线程的向量,加入一个并创建另一个。这种方法的问题在于,如果您的任务是异构的,您可能会浪费处理时间。