超时后,线程睡眠无法继续执行

时间:2018-09-19 15:02:48

标签: c++ command-line thread-sleep

为什么线程会阻塞?

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

main.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; 

}

3 个答案:

答案 0 :(得分:4)

许多输出操作被缓冲。也就是说,它们将等待实际写入字符串,直到它们填满缓冲区为止。这意味着在您将其告知打印与实际打印之间可能会有延迟。

要解决此问题,您可以使用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;
}

答案 1 :(得分:2)

std::cout的输出通常是行缓冲的,这意味着在写入换行符或缓冲的数据达到一定大小之前,控制台不会显示任何内容。试试...

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

或者,用...强制冲洗。

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

答案 2 :(得分:2)

std::cout是一个缓冲流。这意味着您首先写入该流的任何内容都会进入内部缓冲区。仅在运行时/系统决定这样做时,才清空(“清空”)该缓冲区。这样做主要是出于性能方面的考虑。它允许运行时/系统始终不执行大量的微小I / O操作,这会招致相当大的开销,但要等到积累了足够的输出后,才能进行大批量的昂贵I / O。

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

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

如果要在每一行之后刷新,请使用std::endl,它会输出换行符并进行刷新。