sleep_for 造成缓冲效应

sleep_for causes buffering effect

如果我注释掉 sleep_for,程序会毫无问题地生成逗号和点。但是当我添加 sleep_for 时,它会挂起一段时间,然后突然写下所有你希望在挂起期间均匀出现的逗号和点。

这个程序从更大更复杂的东西减少到最小的工作示例,但幸运的是问题仍然存在。

(使用 apt 安装的 g++ 11.2.0 在 Ubuntu 20.04.4 LTS 上编译)

#include <chrono>
#include <iostream>
#include <RingBuffer.h>
#include <thread>

void writeCharToBuffer(volatile bool& quit, char, std::chrono::milliseconds);

int main()
{
    bool quit { false };

    using namespace std::literals;

    std::thread dotToBufferThread { writeCharToBuffer, std::ref(quit), '.', 100ms};
    std::thread commaToBufferThread { writeCharToBuffer, std::ref(quit), ',', 200ms};

    int quitKey;
    std::cin >> quitKey;
    quit = true;

    dotToBufferThread.join();
    commaToBufferThread.join();
}

void writeCharToBuffer(volatile bool& quit, char c, std::chrono::milliseconds d)
{
    while (!quit)
    {
        std::cout << c;
        std::this_thread::sleep_for(d);
    }
}

std::cout 的输出 缓冲的。

没有延迟的输出可能会很快填满缓冲区,您不会注意到它。

如果你想要立即输出,你需要明确地刷新它:

std::cout << c << std::flush;