以任意顺序连接多个线程

Yan*_*ann 5 c++ multithreading

我有一个对象数组std::thread,它们的操作顺序以及它们重新加入主线程的顺序并不重要。我尝试过使用

for(int i = 0; i < noThreads; ++i)
{
    if(threads[i].joinable())
        threads[i].join();
}
Run Code Online (Sandbox Code Playgroud)

但这似乎使它们“按顺序”运行,当然,这可能是因为我从线程的控制台输出按照我分派它们的顺序发生这一事实中得出了这个结论(就像所有线程 #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;
}
Run Code Online (Sandbox Code Playgroud)

其中正在执行的命令是"./otherApp.elf". 请记住,当前将其打印到控制台的事实将更改为输出到各种文件,我如何调度线程以便使它们执行然后重新加入无序?

inf*_*inf 4

执行顺序不受连接顺序的影响。因此,您可以简单地调用join循环来连接所有线程。

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

如果您确实想检查线程是否已完成执行,可能还有其他方法可以实现,如此处所述

Boost已经有了扩展来等待一组或全部 future 和测试函数来查看线程是否已完成执行。