Спящий поток не продолжает выполнение после тайм-аута - PullRequest
0 голосов
/ 19 сентября 2018

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

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

Многие выходные операции буферизируются.То есть они будут ждать записи в строку, пока не заполнят буфер.Это означает, что может быть задержка между сообщением о печати и фактическим.

Чтобы исправить это, вы можете использовать потоковый манипулятор 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;
}
0 голосов
/ 19 сентября 2018

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

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

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

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

0 голосов
/ 19 сентября 2018

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

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

Или форсировать флеш с ...

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