2017-04-20 25 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。但它可能值得一试。 –

回答

相关问题