繁体   English   中英

以任何顺序加入多个线程

[英]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" 请记住,当前打印到控制台的当前事实将更改为输出到各种文件,如何调度线程以便我可以使它们执行然后重新加入乱序?

执行顺序不受连接顺序的影响。 因此,您只需在循环中调用join即可加入所有线程。

值得指出的第二件事是, joinable并不意味着线程是否已经完成执行。 请参阅链接以获取详细说明。

如果你真的想检查线程是否已经完成执行,可能还有其他方法可以执行此操作

Boost已经有扩展来等待一组期货和测试函数中的任何一个或全部,以查看一个线程是否已经完成执行。

您正在使用的for循环为您提供加入的顺序(不是线程执行顺序)。

我的意思是join函数阻塞了等待线程完成的进程,所以如果用你正在使用的for循环检查线程,你就会在第一次连接时阻塞你的主进程, 即使(即)最后一个帖子已经完成了

正如你在这里看到的那样, joinable方法意味着:这个线程是否已启动(或者可能已完成)并且尚未加入?

因此,如果您需要知道线程是否已完成,我认为您可以使用链接到每个线程的信号量,并在一个周期中检查其值。 因此,您不会阻止主进程,并且您将在完成顺序中加入线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM