簡體   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