Почему поток блокируется?
Здравствуйте, я пытаюсь приостановить поток на определенное количество секунд. Я запускаю программу из командной строки.
Программа входит в «сон», но ничего не печатает, пока я не нажму 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;
}
Многие выходные операции буферизируются. То есть они будут ждать записи в строку, пока не заполнят буфер. Это означает, что может быть задержка между тем, когда вы говорите, что печатаете, и когда это действительно происходит.
Чтобы это исправить, вы можете использовать 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
буферизованный поток Это означает, что все, что вы записываете в этот поток, сначала попадает во внутренний буфер. Этот буфер очищается («очищается») только тогда, когда среда выполнения / система решает это сделать. Это сделано в основном из соображений производительности. Это позволяет среде выполнения / системе не выполнять тонны крошечных операций ввода-вывода все время, что повлечет за собой значительные накладные расходы, но ждет, пока накопится достаточно выходных данных, чтобы дорогие операции ввода-вывода могли быть выполнены в больших пакетах.
Вы можете позвонить flush()
метод явного принудительного сброса потока или «вывода» std::flush
в поток:
std::cout << "bla" << std::flush
Если вы хотите очищать после каждой строки, используйте std::endl
, который выводит символ новой строки, а также сбрасывает.