Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ popen管道会减慢其他线程的速度_C++_Multithreading_Pthreads_Popen - Fatal编程技术网

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

C++ popen管道会减慢其他线程的速度,c++,multithreading,pthreads,popen,C++,Multithreading,Pthreads,Popen,我的多线程应用程序有问题。当一个线程执行synchronouspopen()命令时,其他应用程序线程的速度会显著降低。使用popen()执行ffmpeg,生成高负载的线程 正常情况下,其他线程的执行时间为0.0007毫秒。当使用popen时,一些线程会将执行时间增加到14-20秒 如何解决这个问题 系统是FreeBSD6.4 FILE *pipe; char buff[512]; if ( !(pipe = popen( command.c_str(), "r")) )

我的多线程应用程序有问题。当一个线程执行synchronous
popen()
命令时,其他应用程序线程的速度会显著降低。使用
popen()
执行
ffmpeg
,生成高负载的线程

正常情况下,其他线程的执行时间为0.0007毫秒。当使用
popen
时,一些线程会将执行时间增加到14-20秒

如何解决这个问题

系统是FreeBSD6.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的新代码,但没有帮助:

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

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

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

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

高负载线程是否会滥用线程之间共享的任何其他资源(stdin、互斥体等)(保持/锁定时间过长),从而导致其他线程的饥饿

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

如果这是linux,这里有两个堆栈溢出问题可能会有所帮助:


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

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

高负载线程是否会滥用线程之间共享的任何其他资源(stdin、互斥体等)(保持/锁定时间过长),从而导致其他线程的饥饿

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

如果这是linux,这里有两个堆栈溢出问题可能会有所帮助:


wow,谢谢,您确定在通过
fgets
阻止读取时,所有线程都在等待,而不仅仅是调用
fgets
的线程?此
管道
代码仅用于一个螺纹。。。您可以添加一些代码示例来解决这个问题吗?这个问题看起来正是您要解决的问题:。为什么fgets()会阻止当前线程以外的线程?这确实是一个阻塞调用,但只针对当前线程,对吗?@Brady我也在等待答案,但似乎是它的IO调用,它与系统行为有关。哇,谢谢,你确定在阻塞读取时,所有线程都在等待,而不仅仅是调用
fgets
的线程?此
管道
代码仅用于一个螺纹。。。您可以添加一些代码示例来解决这个问题吗?这个问题看起来正是您要解决的问题:。为什么fgets()会阻止当前线程以外的线程?这确实是一个阻塞调用,但只针对当前线程,对吗?@Brady我也在等待答案,但它似乎是IO调用,并且与系统行为有关。谢谢你的回答,是的,首先我想问题在于互斥锁,但是我为了测试的目的修改了代码,这里只有一个用于4个worker+1个主线程的互斥锁,它接受()连接并管理worker的查询。其他带管道的螺纹和
ffmpeg
不使用它。问题仍然存在。。。(2核cpu,不是很好,但也不是很差)。ffmpeg工作时,空闲率接近0-10%,但其他应用程序,如nginx、apach和mysql不会降低速度。是的,问题似乎不在fgets上,我将其重写为非阻塞,并且没有帮助:(popen call的新代码..@abrahab,好吧,那么我认为你能做的最好的事情就是分析应用程序,看看那些线程在做什么。我回答中提到的这个问题有几个很好的替代方法。从“如何在linux中分析pthread mutex”的问题中尝试valgrind drd工具.ffmpeg线程从何处读取?@abrahab,为什么线程位于
pthread_testcancel()< /代码>?你调用它吗?如果是,为什么?对于闪亮的剖析器,等等,你可以考虑将剖析信息倾倒到一个文件中。谢谢你的回答,是的,首先我想问题是在互斥中,但是我为测试目的做了代码更改。