【发布时间】:2019-01-16 08:02:02
【问题描述】:
所以我正在尝试创建一个程序,该程序实现一个生成随机数 (n) 并基于 n 创建 n 个线程的函数。主线程负责打印叶子的最小值和最大值。 Main线程的层次结构深度为3。
我已经写了下面的代码:
#include <iostream>
#include <thread>
#include <time.h>
#include <string>
#include <sstream>
using namespace std;
// a structure to keep the needed information of each thread
struct ThreadInfo
{
long randomN;
int level;
bool run;
int maxOfVals;
double minOfVals;
};
// The start address (function) of the threads
void ChildWork(void* a) {
ThreadInfo* info = (ThreadInfo*)a;
// Generate random value n
srand(time(NULL));
double n=rand()%6+1;
// initialize the thread info with n value
info->randomN=n;
info->maxOfVals=n;
info->minOfVals=n;
// the depth of recursion should not be more than 3
if(info->level > 3)
{
info->run = false;
}
// Create n threads and run them
ThreadInfo* childInfo = new ThreadInfo[(int)n];
for(int i = 0; i < n; i++)
{
childInfo[i].level = info->level + 1;
childInfo[i].run = true;
std::thread tt(ChildWork, &childInfo[i]) ;
tt.detach();
}
// checks if any child threads are working
bool anyRun = true;
while(anyRun)
{
anyRun = false;
for(int i = 0; i < n; i++)
{
anyRun = anyRun || childInfo[i].run;
}
}
// once all child threads are done, we find their max and min value
double maximum=1, minimum=6;
for( int i=0;i<n;i++)
{
// cout<<childInfo[i].maxOfVals<<endl;
if(childInfo[i].maxOfVals>=maximum)
maximum=childInfo[i].maxOfVals;
if(childInfo[i].minOfVals< minimum)
minimum=childInfo[i].minOfVals;
}
info->maxOfVals=maximum;
info->minOfVals=minimum;
// we set the info->run value to false, so that the parrent thread of this thread will know that it is done
info->run = false;
}
int main()
{
ThreadInfo info;
srand(time(NULL));
double n=rand()%6+1;
cout<<"n is: "<<n<<endl;
// initializing thread info
info.randomN=n;
info.maxOfVals=n;
info.minOfVals=n;
info.level = 1;
info.run = true;
std::thread t(ChildWork, &info) ;
t.join();
while(info.run);
info.maxOfVals= max<unsigned long>(info.randomN,info.maxOfVals);
info.minOfVals= min<unsigned long>(info.randomN,info.minOfVals);
cout << "Max is: " << info.maxOfVals <<" and Min is: "<<info.minOfVals;
}
代码编译没有错误,但是当我执行它时,它给了我这个:
libc++abi.dylib:以未捕获的类型异常终止 std::__1::system_error:线程构造函数失败:资源 暂时不可用中止陷阱:6
【问题讨论】:
-
看起来你在没有检查递归深度的情况下生成了新线程。
-
这比
n线程创建了更多的地狱。if(info->level > 3) { info->run = false; }之后的所有内容不应该在合格的else或其他一些显式替代代码路径中吗?无关,srand应该在每个进程执行时调用 一次,而不是每个线程启动一次。 -
你应该提高并发编程的基础。您正在使用 bool 来验证一侧线程的终止,并加入刚刚在另一侧创建的线程(这违背了目的)。您应该使用 thread.join() 等待线程,而不是布尔值
-
为什么要分离线程,然后明确检查它们是否正在运行,而不是将它们保存在集合中并加入它们?
-
您可以将
main中的 spawn-and-join 替换为普通函数调用。
标签: c++ multithreading recursion