2017-04-20 56 views
0

我在一個「工作人員」模式中使用pthreads,我有大量命令要運行,並且我想讀取每個命令的輸出併合並所有輸出。使用並行線程創建每個核心一個工作線程,每個工作線程基本上具有以下功能:如何使用pthreads從多個正在運行的進程中一次讀取?

for (;;) { 
    const char *command = get_from_work_queue(); 
    if (command == NULL) 
     break; 
    FILE *fp = popen("long-running-command", "r"); 
    // ... loops reading fp until EOF 
    // enqueue data read from fp 
} 

兩個get_from_work_queue和「排隊數據」需要線程暫時獲得互斥,如隊列是共享的,但這些在對popen()fread()的任何調用之前釋放互斥體。

我的問題是,雖然我有四個內核和四個工作線程,但任何時候都只有一個長時間運行的命令。其他三個線程只是坐在一旁,可能正在等待安排。

我認爲popenfread阻止所有的線程,而不僅僅是調用者。我怎樣才能從命令讀取而不用阻塞其他線程,所以我可以同時運行四個長時間運行的命令?

+0

爲什麼不使用'select'與一堆文件描述符? –

+0

這裏接受的答案:[popen()alternative](http://stackoverflow.com/questions/6743771/popen-alternative)可能值得一試,看看你是否得到了更好/理想的行爲。 –

+0

@PhilBrubaker我不明白爲什麼分支額外的shell會產生變化---事實是我需要*來運行shell。但它可能值得一試。 –

回答

相關問題