【问题标题】:Multiple calls to std::cout make subprocess hang多次调用 std::cout 使子进程挂起
【发布时间】:2018-08-09 16:59:39
【问题描述】:

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

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

事实证明,使用std::cout 打印太多行会导致这种情况,但我想了解原因。会不会是 wxWidgets 使用了一些缓冲区来存储应用程序输出而打印只是溢出了它?或者这是 Windows 的原生问题?或者它可能与std::cout 实现有关? 我很确定我无法使用 printf 重现此问题看来我错了 - printf 似乎也触发了该问题

【问题讨论】:

  • 您非常确定或者您 100% 确定(您实际测试过)?
  • 我不会撒谎:这听起来不太可能。
  • 如果您复制代码中重现观察到的问题的部分会更好。
  • 您是否在调用 std::cout 并且当您调试并越过该行时它会挂起?

标签: c++ windows subprocess wxwidgets


【解决方案1】:

标准输出缓冲区的大小是有限的。一定有东西正在读取您正在写入缓冲区的内容,无论是文件、控制台窗口还是其他进程。如果你的写入速度超过了阅读器的处理速度,那么缓冲区最终会填满并阻止任何进一步的写入,直到阅读器读取了一些数据。

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2014-08-22
    • 2016-11-02
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多