【问题标题】:Why doesn't std::this_thread::sleep_for() work in MacOS terminal?为什么 std::this_thread::sleep_for() 在 MacOS 终端中不起作用?
【发布时间】:2018-09-07 11:03:34
【问题描述】:

说明

以这个基本代码为例。

#include <iostream>
#include <thread>

int main(int argc, const char * argv[]) {
    while(true){
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        std::cout << "loop";
    }
}

当我在 XCode 中运行它时,它完全按预期工作。它每秒打印出来,“循环”。但是,当我在终端中运行它时,什么也没有发生。代码似乎正在“运行”,但没有任何内容打印到屏幕上。

问题:

为什么std::this_thread::sleep_for() 可以在 XCode 终端上工作,而不能在标准的 MacOS 终端上工作?

【问题讨论】:

  • 因为“终端”会缓冲您的 stdout,而 Xcode 会立即刷新它。要么自己刷新标准输出,要么在末尾添加 std::endl 隐式执行
  • @JustSid:请在答案部分回答。
  • @Bathsheba 发表评论后,我正在写一个完整的答案。我已将其中的部分内容纳入社区 wiki 答案

标签: c++ xcode macos c++11


【解决方案1】:

std::this_thread::sleep_for() 在终端中也可以正常工作,问题是 stdout 在终端上被缓冲。 stdout 可以显式刷新,也可以在缓冲区太满或遇到换行符之类的情况时隐式刷新。

要么自己刷新标准输出,要么在末尾添加std::endl,这会隐式执行。

您也可以使用std::cerr &lt;&lt; "loop";,因为错误流通常是无缓冲的(尽管 C++ 标准并不坚持这样做)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2021-12-25
    • 2017-09-18
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多