以任何顺序加入多个线程

时间:2014-09-24 10:11:08

标签: c++ multithreading

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

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

似乎使它们按顺序运行&#34;当然,这可能是因为我从控制台输出的事实中得出了这个结论从线程发生的顺序是我将它们分派(如在线程#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"。请记住,当前打印到控制台的当前事实将更改为输出到各种文件,如何分配线程以便我可以使它们执行然后重新加入无序?

2 个答案:

答案 0 :(得分:3)

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

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

如果你真的想检查某个线程是否已经完成执行,可能还有其他方法可以按照here所述进行操作。

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

答案 1 :(得分:1)

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

我的意思是join函数阻止了等待线程完成的进程,所以如果你用你正在使用的for循环检查线程,你将在第一个上阻止你的主进程加入即使(即)最后一个帖子已经完成

正如您所见i.e. herejoinable方法意味着:这个线程是否已启动(或可能已完成)但尚未加入?

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