C++中sleep_for结合线程循环时未按预期工作的问题
问题本质:标准输出缓冲,而非线程理解误区
这和C++线程完全无关,核心是标准输出流的缓冲机制在起作用:
- 默认情况下,
std::cout采用行缓冲策略——只有当输出内容包含换行符(\n)、缓冲区被填满,或者程序即将结束时,才会把缓冲区里暂存的内容刷新到终端显示。 - 你最初的代码里,循环内只打印数字却没有换行,所有输出都被临时存在缓冲区里,等10秒循环结束后才一次性被刷新出来,看起来像是线程延迟,但其实和线程无关。
- 加入
std::cout<<"\n"后,每次输出都会触发行缓冲的即时刷新,所以每一秒都会把当前数字输出到终端,符合你的预期。
另外还有两种等价的解决方式,不需要依赖换行:
- 手动调用刷新函数:
std::cout.flush(); - 使用
std::endl,它的作用是插入换行符并刷新缓冲区,和std::cout << "\n" << std::flush;效果一致。
内容的提问来源于stack exchange,提问作者Ashwin Prasad
相关产品推荐
相关产品推荐

