超时后,线程睡眠不会继续执行



为什么线程会阻塞?

您好,我正在尝试将线程暂停给定的秒数。我正在从命令行运行该程序。 程序进入"睡眠"但不打印任何内容,直到我按CTRL+C,此时它会批量打印所有内容。为什么它在后台工作?为什么每次sleep_for后它不打印到控制台?

主.cpp

#include<iostream>
#include<chrono>
#include<thread>
#include<string>
#include <unistd.h>
int main(int argc,char *argv[])
{
std::cout<<"Started daemon..."<<std::endl;
std::string hostString(argv[1]);
std::cout<<"HostName:"<<hostString<<std::endl;
std::cout<<"Port:"<<atoi(argv[2]);
int i=0;
while(true){
std::cout<<"Iterations:"<<i;
std::this_thread::sleep_for (std::chrono::seconds(1));
if(i++>10000) i=0;
}
return 0; 
}

许多输出操作都是缓冲的。 也就是说,他们将等待实际写入字符串,直到填满缓冲区。 这意味着在您告诉它打印和实际打印之间可能存在延迟。

要解决此问题,您可以使用flush流操纵器强制写入内容。 这将使您的代码看起来像

while(true){
std::cout<<"Iterations:"<<i << std::flush;
std::this_thread::sleep_for (std::chrono::seconds(1));
if(i++>10000) i=0;
}

如果您的流是行缓冲的,那么您也可以打印一个换行符,例如

while(true){
std::cout<<"Iterations:"<<i << "n";
std::this_thread::sleep_for (std::chrono::seconds(1));
if(i++>10000) i=0;
}

一般来说,输出到std::cout是行缓冲的,这意味着在写入换行符或缓冲数据达到一定大小之前,控制台上不会出现任何内容。 尝试。。。

std::cout << "Iterations: "<< i << "n";

或者,强制冲洗...

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

std::cout是一个缓冲流。这意味着您首先写入该流的任何内容都会进入内部缓冲区。该缓冲区仅在运行时/系统决定清空("刷新"(时清空("刷新"(。这样做主要是出于性能原因。它允许运行时/系统不会一直执行大量微小的I/O操作,这会产生相当多的开销,但要等到积累了足够的输出,以便可以大批量完成昂贵的I/O。

可以调用flush()方法来显式强制刷新流或将流"输出"std::flush到流:

std::cout << "bla" << std::flush

如果要在每行之后刷新,请使用std::endl,这将输出换行符并刷新。

最新更新