[英]Joining multiple threads in any order
我有一个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"
。 请记住,当前打印到控制台的当前事实将更改为输出到各种文件,如何调度线程以便我可以使它们执行然后重新加入乱序?
您正在使用的for循环为您提供加入的顺序(不是线程执行顺序)。
我的意思是join
函数阻塞了等待线程完成的进程,所以如果用你正在使用的for循环检查线程,你就会在第一次连接时阻塞你的主进程, 即使(即)最后一个帖子已经完成了 。
正如你在这里看到的那样, joinable
方法意味着:这个线程是否已启动(或者可能已完成)并且尚未加入?
因此,如果您需要知道线程是否已完成,我认为您可以使用链接到每个线程的信号量,并在一个周期中检查其值。 因此,您不会阻止主进程,并且您将在完成顺序中加入线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.