this_thread::sleep_for und while



  • Ich möchte einen linux daemon schreiben, der immer wieder eine Variable nach seinen Wert überprüft. Leider habe ich mit std::this_thread::sleep_for ein Problem. Bei diesem kleinen Codebeispiel wird die Variable nie ausgegeben. Nach ein wenig herumprobieren habe ich herausgefunden, dass die sleep_for Funktion immer sofort aufgerufen wird und der Ausgabebefehl übersprungen wird, bis die sleep_for Funktion nicht mehr aufgerufen wird. Was mache ich falsch? Oder besser, wie mache ich es richtig?

    #include <thread>
    #include <iostream>
    
    int main()
    {
    
            std::cout << 12; //Der Wert wird erst nach der sleep_for Funktion ausgegeben.
    
            std::this_thread::sleep_for(std::chrono::seconds(1));
    
    }
    
    #include <thread>
    #include <iostream>
    
    int main()
    {
        while(true)
        {
            std::cout << 12; //Der Wert wird nie ausgegeben.
    
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    }
    


  • Der Grund ist wieso der Wert nie ausgegeben wird, ist der, dass die Streams gepuffert sind.
    Erst bei Programmende oder nach xxx Zeichen wird der Puffer gelehrt und der eigentliche write systemcall aufgerufen.
    Ein manuelles Leeren des Puffers kannst du via der Memberfunktion flush erzwingen.
    Dann bleibt nur noch der Puffer des OS, den du evtl. zusätzlich noch einmal flushen soll, aber probiers erst mal so.



  • Vielen Dank! Jetzt funktioniert es wie gewollt.

    int main()
    {
        while(true)
        {
            std::cout << 12 << std::endl;
    
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    }
    

Log in to reply