c++ - popen 管道会减慢其他线程的速度

标签 c++ multithreading pthreads popen

我的多线程应用程序有问题。当一个线程执行同步 popen() 命令时,其他应用程序线程的速度会显着减慢。带有 popen() 的线程执行 ffmpeg,产生高负载。

正常情况下,其他线程执行时间为0.0007毫秒。当使用 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 can 的新代码,但没有帮助:Correct Code - Non-blocking pipe with popen

最佳答案

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

关于c++ - popen 管道会减慢其他线程的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960622/

相关文章:

gcc - gcc的-lpthread选项

c++ - 这个运算符是别名吗?

c++ - 如何通过c++_中不同目录中的文件使用变量

c++ - 函数没有实现宏?

c++ - std::atomic_store 和 std::atomic_exchange 不交换

c - 我的自旋锁实现是否正确且最佳?

c - 从这个给定的示例中,TCP/UDP 连接发生在哪里?

iphone - NSCondition 是如何工作的?

python - 从 pyqt 线程内部启动多个线程

unix - 使用一个 pthread_mutex_t 和多个 pthread_cond_t 和 pthread_cond_wait()