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;
如果我注释掉 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;