popen pipe减缓了其他线程

时间:2012-06-09 11:30:11

标签: c++ multithreading pthreads popen

我的多线程应用程序有问题。当在一个线程执行同步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

2 个答案:

答案 0 :(得分:2)

fgets是一个阻塞读取,因此当上面的线程正在等待从管道读取数据时,其他线程被阻塞。您将需要对文件描述符使用select / poll,以便在发出读取之前查看管道上是否有数据。这样,你可以抢占这个线程,让其他线程运行起来做有用的工作。

答案 1 :(得分:2)

不同线程之间有什么关系?如果它们相互依赖,意味着它们来回发送数据,那么如果一个线程变慢,那么其他线程也是如此。

要考虑的其他事项是执行ffmpeg的线程如何影响系统的其余部分。例如,如果它是一个单核CPU并且该特定线程正在产生高CPU负载,那么这将为其余线程留下更少的周期,从而减慢它们的速度。当然,从0.0007毫秒到14-20秒的变化确实是极端的!

高负载线程可能滥用(保持/锁定太长)的线程之间是否有任何其他资源共享(stdin,互斥锁等),从而导致其他线程的饥饿?

此外,我建议分析应用程序(或至少一些线程),看看它为什么这么慢。我几乎肯定你会发现一些线程被阻塞等待公共资源,比如互斥或类似的东西。

如果这是linux,这里有2个Stack Overflow问题可能会有所帮助: