2012-06-15 5 views
27

Ich wollte wissen, was ist der Unterschied zwischen C++ 11 std::this_thread::yield() und std::this_thread::sleep_for()? Und wie zu entscheiden, was zu verwenden? Vielen Dank.Standard :: this_thread :: yield() vs Std :: this_thread :: sleep_for()?

+1

möglich duplizieren von [Geben Sie die Zeitscheibe für den aktuellen Thread in C++] (http://stackoverflow.com/questions/11048657/giving-up-the-time-slice-for-current-thread -in-c) – ypnos

+1

Es scheint dort nicht beantwortet zu werden. – polapts

+1

'Ausbeute' wirft nicht. 'sleep_for' darf werfen. – dirkgently

Antwort

24

std::this_thread::yield erzählt die Durchführung die Ausführung von Threads neu zu planen, die in einem Fall verwendet werden sollen, wenn Sie in einem langen Wartezustand, wie in einem Thread-Pool sind:

... 
while(true) { 
    if(pool.try_get_work()) { 
    // do work 
    } 
    else { 
    std::this_thread::yield(); // other threads can push work to the queue now 
    } 
} 

std::this_thread::sleep_for kann, wenn Sie verwendet werden, Ich möchte wirklich auf eine bestimmte Zeit warten. Dies kann für Aufgaben verwendet werden, bei denen das Timing wirklich zählt, z. B. wenn Sie wirklich nur 2 Sekunden warten möchten. (Beachten Sie, dass die Umsetzung möglicherweise länger warten als die vorgegebene Zeitdauer)

+0

Also, bedeutet es, dass std :: this_thread :: yield die Ausführung für 'einige Zeit' aufgibt und es erneut versucht? Wie funktioniert der Thread beim nächsten Mal? – polapts

+4

@polapts Ja, 'std :: this_thread :: yield' erlaubt dem Scheduler nur, einen anderen Thread auszuführen. Wenn der Scheduler zu diesem Thread zurückkehrt, wird er nach dem Aufruf von 'std :: this_thread :: yield 'weiterarbeiten – inf

10

std :: this_thread :: sleep_for()

wird der Thread Schlaf für eine bestimmte Zeit machen (der Thread gestoppt wird eine bestimmte Zeit). (http://en.cppreference.com/w/cpp/thread/sleep_for)

std :: :: this_thread Ausbeute()

wird die Ausführung des aktuellen Threads stoppen und vorrangig zu anderen Prozess/Fäden (wenn es andere Prozess/Threads wartet in der Warteschlange). Die Ausführung des Threads wird nicht gestoppt. (Es gibt nur die CPU frei). (http://en.cppreference.com/w/cpp/thread/yield)

Verwandte Themen