我的多线程应用程序有问题。当在一个线程执行同步popen()
命令时 - 其他应用程序线程显着减慢。 popen()
执行ffmpeg
的线程会产生高负载。
通常,其他线程的执行时间为0.0007 ms。当使用popen
时,一些线程的执行时间增加到14-20秒。
如何解决这个问题?
系统是FreeBSD 6.4
FILE *pipe;
char buff[512];
if ( !(pipe = popen( command.c_str(), "r")) )
{ // if pipe is NULL
return false;
}
while ( fgets(buff, sizeof(buff), pipe) != NULL )
{
ptr_output->append(buff);
}
这里是popen的新代码,它无济于事:Correct Code - Non-blocking pipe with popen
答案 0 :(得分:2)
fgets是一个阻塞读取,因此当上面的线程正在等待从管道读取数据时,其他线程被阻塞。您将需要对文件描述符使用select / poll,以便在发出读取之前查看管道上是否有数据。这样,你可以抢占这个线程,让其他线程运行起来做有用的工作。
答案 1 :(得分:2)
不同线程之间有什么关系?如果它们相互依赖,意味着它们来回发送数据,那么如果一个线程变慢,那么其他线程也是如此。
要考虑的其他事项是执行ffmpeg
的线程如何影响系统的其余部分。例如,如果它是一个单核CPU并且该特定线程正在产生高CPU负载,那么这将为其余线程留下更少的周期,从而减慢它们的速度。当然,从0.0007毫秒到14-20秒的变化确实是极端的!
高负载线程可能滥用(保持/锁定太长)的线程之间是否有任何其他资源共享(stdin,互斥锁等),从而导致其他线程的饥饿?
此外,我建议分析应用程序(或至少一些线程),看看它为什么这么慢。我几乎肯定你会发现一些线程被阻塞等待公共资源,比如互斥或类似的东西。
如果这是linux,这里有2个Stack Overflow问题可能会有所帮助: