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