【发布时间】:2014-09-24 10:11:07
【问题描述】:
我有一个 std::thread 对象数组,它们以什么顺序操作以及它们重新加入主线程的顺序无关紧要。我试过使用
for(int i = 0; i < noThreads; ++i)
{
if(threads[i].joinable())
threads[i].join();
}
但是 似乎 让它们“按顺序”运行,当然这可能是我从线程的控制台输出发生在命令我分派它们(如线程#1的所有输出,然后是线程#2的所有输出)。我也尝试过threads[i].detach(),但我不知道每个线程的执行时间,所以我无法暂停程序,直到它们完成。
每个线程正在做的工作是:
int spawn(const char* cmd)
{
FILE *fp = popen(cmd, "r");
char buff[512];
if(vFlag == 1)
{
while(fgets(buff, sizeof(buff), fp)!= NULL)
{
printf("%s", buff);
}
}
int w = pclose(fp);
if(WIFEXITED(w))
return WEXITSTATUS(w);
else
return -1;
}
正在执行的命令是"./otherApp.elf"。请记住,当前将其打印到控制台的事实将更改为输出到各种文件,我如何调度线程以便我可以让它们执行然后乱序重新加入?
【问题讨论】:
-
1)
joinable并不像您认为的那样。 2) 执行顺序不受连接顺序的影响 -
线程将并行执行。
join只是表示“阻塞,直到相关线程完成”,并且您加入线程的顺序不会影响执行顺序。 -
因此,如果我像我那样在 for 循环中运行并
join()每个线程,它将“正确”运行? -
@bamboon 谢谢,我不确定这只是我对执行顺序的看法还是实际的顺序变化,请澄清一下。
-
@bamboon 如果你想把它写成答案,我会接受它
标签: c++ multithreading