gpt4 book ai didi

c++ - 不可预测的 C++ sleep /等待行为

转载 作者:行者123 更新时间:2023-12-01 14:20:14 30 4
gpt4 key购买 nike

我一定是在做一些愚蠢的事情,因为我从这个简单的 sleep 代码中得到了最奇怪的行为。最初我使用的是 std::this_thread::sleep_for 并得到了相同的结果但假设它一定是一些线程奇怪。但是,我在等待下面的代码时遇到了同样看似无序的等待。使用 clang++ 或 g++ 结果相同。我在 Debian 上并在命令行编译。

预期行为:将在 3... [等待一秒钟] 2... [等待一秒钟] 1... [等待一秒钟;程序退出]

实际行为:[3 秒长等待] 正在关闭 3...2...1...[程序退出]

#include<chrono>
#include<iostream>

void Sleep(int i) {
auto start = std::chrono::high_resolution_clock::now();
auto now = std::chrono::high_resolution_clock::now();
while (std::chrono::duration_cast<std::chrono::seconds>(now-start).count() < i)
now = std::chrono::high_resolution_clock::now();
}

void ShutdownCountdown(int i) {
if (i <= 0) return;

std::cout << "Shutting down in ";
for (; i != 0; --i) {
std::cout << i << "... ";
Sleep(1);
}
std::cout << std::endl << std::endl;
}

int main (int argc, char *argv[]) {
ShutdownCountdown(3);

return 0;
}

最佳答案

通常 iostream 在遇到换行符之前不会刷新。由于您不输出 EOL 字符,因此您需要显式刷新以打印输出:

        std::cout << i << "... " << std::flush;

无关,但还请注意,当您运行程序时,CPU 会变得有点。为了节省能源,考虑将繁忙的循环改回真正的 sleep :

    for (; i != 0; --i) {
std::cout << i << "... " << std::flush;
std::this_thread::sleep_for(1s);
}

在程序开头使用 using namespace std::chrono_literals; 可以使用漂亮的“1s”语法。

关于c++ - 不可预测的 C++ sleep /等待行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62290758/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com