多次调用std :: cout会使子进程挂起

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多次调用std :: cout会使子进程挂起相关的知识,希望对你有一定的参考价值。

我将在此处复制上一个问题的一部分来描述问题:

我用C ++编写了一个应用程序,它有两个部分 - 前端和后端。这两个使用wxWidgets提供的IPC层进行通信。在后端,我使用一些遗留函数进行图像数据操作。其中一个函数有时会挂起或陷入某些无限循环(我可以观察到某个点之后进程使用了​​0%的进程资源),但只有当我将后端作为前端的子进程运行时才会发生这种情况。否则(当我手动运行时)它工作得很好。

事实证明,用std::cout打印太多线条导致了这一点,但我想了解原因。是不是wxWidgets利用一些缓冲区来存储应用程序输出,打印只是溢出它?或者这是Windows的本机问题?或者它可能与std::cout实施有关? 我很确定我无法用printf重现这一点 似乎我错了 - printf似乎也引发了这个问题

答案

stdout缓冲区的大小有限。必须读取您正在写入缓冲区的内容,无论是文件,控制台窗口还是其他进程。如果你的写入速度快于读者能够处理的速度,那么缓冲区最终将填满并阻止任何进一步的写入,直到读者读取了一些数据。

以上是关于多次调用std :: cout会使子进程挂起的主要内容,如果未能解决你的问题,请参考以下文章

R 检查不喜欢 std:cout (C++)

当我调用 std::abort() 时未显示 cout

如何使子进程窗口在我的进程中显示为模态?

进程挂起从托管代码中调用 AmsiScanBuffer

在 C++ 中创建 std 线程会使程序崩溃

DEV C++ 中的 GDB 在 cout 上停止