Спящий поток не продолжает выполнение после тайм-аута

Почему поток блокируется?

Здравствуйте, я пытаюсь приостановить поток на определенное количество секунд. Я запускаю программу из командной строки.
Программа входит в «сон», но ничего не печатает, пока я не нажму 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;

}

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;
}
4

Другие решения

Выход на std::cout это, вообще говоря, буферизованная строка, означающая, что на консоли ничего не появится, пока либо не будет написана новая строка, либо буферизованные данные не достигнут определенного размера. Пытаться…

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

Или заставить флеш с …

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

std::cout буферизованный поток Это означает, что все, что вы записываете в этот поток, сначала попадает во внутренний буфер. Этот буфер очищается («очищается») только тогда, когда среда выполнения / система решает это сделать. Это сделано в основном из соображений производительности. Это позволяет среде выполнения / системе не выполнять тонны крошечных операций ввода-вывода все время, что повлечет за собой значительные накладные расходы, но ждет, пока накопится достаточно выходных данных, чтобы дорогие операции ввода-вывода могли быть выполнены в больших пакетах.

Вы можете позвонить flush() метод явного принудительного сброса потока или «вывода» std::flush в поток:

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

Если вы хотите очищать после каждой строки, используйте std::endl, который выводит символ новой строки, а также сбрасывает.

2
По вопросам рекламы [email protected]