我在“工作人员”模式中使用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
的内容阻止所有线程,而不仅仅是调用者。如何在没有阻止其他线程的情况下从命令中读取,这样我可以同时运行四个长时间运行的命令?
答案 0 :(得分:0)
如果我使用read(2)
代替fread(3)
,那么它可以正常工作。有关详细信息,请参阅我对What multithreading package for Lua "just works" as shipped?