[英]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.