线程睡眠超时后不继续执行
Thread sleep does not continue execution after timeout
为什么线程会阻塞?
您好,我正在尝试从命令行暂停一个线程给定数量的 seconds.I am 运行 程序。
程序进入 "sleep" 但不打印任何内容,直到我按 CTRL+C
时它打印了它必须在 bulk.Why 中打印的所有内容它在后台工作吗?为什么不呢在每个 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;
}
std::cout
的输出一般来说是行缓冲的,这意味着在写入换行符或缓冲数据达到一定大小之前,控制台上不会出现任何内容。尝试...
std::cout << "Iterations: "<< i << "\n";
或者,用...强制同花顺
std::cout << "Iterations: "<< i << std::flush;
缓冲了许多输出操作。也就是说,它们将等待实际写入字符串,直到它们填满缓冲区。这意味着在您告诉它打印和实际打印之间可能会有延迟。
要解决此问题,您可以使用 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
是缓冲流。这意味着您首先写入该流的任何内容都会进入内部缓冲区。只有当 runtime/system 决定这样做时,该缓冲区才会被清空 ("flushed")。这样做主要是出于性能原因。它允许 runtime/system 不必一直执行大量微小的 I/O 操作,这会产生相当大的开销,而是等到积累了足够的输出,以便可以在 I/O 中完成昂贵的操作更大的批次。
您可以调用 flush()
方法显式强制刷新流或 "output" std::flush
到流:
std::cout << "bla" << std::flush
如果要在每行后刷新,请使用 std::endl
,它会输出换行符并刷新。
为什么线程会阻塞?
您好,我正在尝试从命令行暂停一个线程给定数量的 seconds.I am 运行 程序。
程序进入 "sleep" 但不打印任何内容,直到我按 CTRL+C
时它打印了它必须在 bulk.Why 中打印的所有内容它在后台工作吗?为什么不呢在每个 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;
}
std::cout
的输出一般来说是行缓冲的,这意味着在写入换行符或缓冲数据达到一定大小之前,控制台上不会出现任何内容。尝试...
std::cout << "Iterations: "<< i << "\n";
或者,用...强制同花顺
std::cout << "Iterations: "<< i << std::flush;
缓冲了许多输出操作。也就是说,它们将等待实际写入字符串,直到它们填满缓冲区。这意味着在您告诉它打印和实际打印之间可能会有延迟。
要解决此问题,您可以使用 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
是缓冲流。这意味着您首先写入该流的任何内容都会进入内部缓冲区。只有当 runtime/system 决定这样做时,该缓冲区才会被清空 ("flushed")。这样做主要是出于性能原因。它允许 runtime/system 不必一直执行大量微小的 I/O 操作,这会产生相当大的开销,而是等到积累了足够的输出,以便可以在 I/O 中完成昂贵的操作更大的批次。
您可以调用 flush()
方法显式强制刷新流或 "output" std::flush
到流:
std::cout << "bla" << std::flush
如果要在每行后刷新,请使用 std::endl
,它会输出换行符并刷新。