2

我的多线程应用程序有问题。当在一个线程执行同步popen()命令时 - 其他应用程序线程显着减慢。popen()带有execute的线程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 的新代码,但无济于事:正确的代码 - 带有 popen 的非阻塞管道

4

2 回答 2

2

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

于 2012-06-09T12:06:06.853 回答
2

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

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

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

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

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

于 2012-06-09T15:00:36.413 回答