【发布时间】:2010-02-18 16:39:20
【问题描述】:
我有以下情况:
我创建了一个 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
}
// ...
谁有这方面的经验,感谢任何见解。
【问题讨论】:
标签: c++ parallel-processing boost-thread