【问题标题】:Thread sleep does not continue execution after timeout线程休眠超时后不继续执行
【发布时间】:2018-09-19 15:02:47
【问题描述】:

为什么线程会阻塞?

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

ma​​in.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; 

}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      或者,用...强制刷新

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

      【讨论】:

      • 但是我用过std::endl是不是一样的东西?
      • 但是您还没有使用std::endl 作为while 循环内的输出。
      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-08-05
        • 2013-03-05
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多