如何使用pthreads一次读取许多正在运行的进程?

时间:2017-04-20 22:14:02

标签: c file-io pthreads

我在“工作人员”模式中使用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的内容阻止所有线程,而不仅仅是调用者。如何在没有阻止其他线程的情况下从命令中读取,这样我可以同时运行四个长时间运行的命令?

1 个答案:

答案 0 :(得分:0)

如果我使用read(2)代替fread(3),那么它可以正常工作。有关详细信息,请参阅我对What multithreading package for Lua "just works" as shipped?

的回答