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()
的任何调用之前释放互斥体。
我的问题是,虽然我有四个内核和四个工作线程,但任何时候都只有一个长时间运行的命令。其他三个线程只是坐在一旁,可能正在等待安排。
我认为popen
或fread
阻止所有的线程,而不仅仅是调用者。我怎样才能从命令读取而不用阻塞其他线程,所以我可以同时运行四个长时间运行的命令?
为什么不使用'select'与一堆文件描述符? –
这里接受的答案:[popen()alternative](http://stackoverflow.com/questions/6743771/popen-alternative)可能值得一试,看看你是否得到了更好/理想的行为。 –
@PhilBrubaker我不明白为什么分支额外的shell会产生变化---事实是我需要*来运行shell。但它可能值得一试。 –