我遇到与this非常相似的问题。不幸的是,我不允许对此发表评论,所以请原谅我为此开辟另一个主题。我的代码迭代地运行两阶段计算,原则上如下:
while(!finishing_condition_met)
{
boost::thread_group executionGrp1;
for(int w = 0; w < numThreads; w++)
{
boost::thread * curThread = new boost::thread(&Class::operation1, this, boost::ref(argument1), ...);
executionGrp1.add_thread(curThread);
}
executionGrp1.join_all();
boost::thread_group executionGrp2;
for(int w = 0; w < numThreads; w++)
{
boost::thread * curThread = new boost::thread(&Class::operation2, this, boost::ref(argument1), ...);
executionGrp2.add_thread(curThread);
}
executionGrp2.join_all();
update_finished_criterion();
}
由于numThreads明显小于内核允许的内容(它被设置为硬件并发,当前机器上为56),我很惊讶看到这个错误。 join_all()不会处理完成的线程吗? 另一篇文章中提出的thread_pool方法似乎很有意思,但我并不确定如何调整它以便我可以多次重新运行循环内的所有内容,同时仍然等待第一阶段完成后再开始第二阶段。
欢迎任何建议!提前谢谢。
编辑:这就是我如何以简约的方式导致此错误。 AFAIK,这是实现并行部分的标准方法。我错过了什么吗?
#include "boost/thread.hpp"
#include "boost/chrono.hpp"
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
int numThreads = boost::thread::hardware_concurrency();
void wait(int seconds) {
boost::this_thread::sleep_for(boost::chrono::milliseconds(seconds));
return;
}
int subthread(int i) {
wait(i/numThreads);
return 1;
}
void threads(int nT) {
boost::thread_group exeGrp;
for (int i=0;i<nT;i++) {
boost::thread * curThread = new boost::thread(&subthread, i);
exeGrp.add_thread(curThread);
}
exeGrp.join_all();
}
int main() {
for (int a=0;a<numThreads;a++) {
cout << "Starting " << numThreads << " threads [" << a << "/" << numThreads << "]" << endl;
threads(numThreads);
}
cout << "done" << endl;
}