2012-06-15 38 views
27

C++ 11 std::this_thread::yield()std::this_thread::sleep_for()の違いは何ですか?そして何を使うべきかを決めるには?ありがとう。もしあればstd :: this_thread :: yield()vs std :: this_thread :: sleep_for()?

... 
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を使用することができます。

+1

[C++の現在のスレッドのタイムスライスを与える](http://stackoverflow.com/questions/11048657/giving-up-the-time-slice-for-current-thread) -in-c) – ypnos

+1

そこには答えられないようです。 – polapts

+1

'yield'はスローしません。 'sleep_for'が投げるかもしれません。 – dirkgently

答えて

24

std::this_thread::yieldは、スレッドプールのように、あなたがビジー待ちの状態にある場合に使用すべきことは、スレッドの実行を再スケジュールするために実装を伝えます本当に特定の時間を待つことを望んでいます。これは、実際にタイミングが重要なタスクに使用できます。たとえば、実際には2秒待つだけの場合です。

+0

それでは、std :: this_thread :: yieldが 'some time'の実行を放棄し、もう一度tryを実行することを意味しますか?次回試してみると、スレッドはどのように動きますか? – polapts

+4

@polaptsはい、 'std :: this_thread :: yield'はスケジューラが他のスレッドを実行できるようにします。スケジューラがこのスレッドに戻ると、 'std :: this_thread :: yield'の呼び出しの後で動作します。 – inf

10

がのstd :: this_thread :: sleep_for()与えられた時間のためにあなたのスレッドのスリープを行います

(スレッドが停止された(実装は与えられた時間期間よりも長く待つ場合があります)所定の時間)。 (http://en.cppreference.com/w/cpp/thread/sleep_for

のstd :: this_thread ::収率()

は、現在のスレッドの実行を停止して待機している他のプロセス/スレッドが存在する場合(他のプロセス/スレッドに優先権を与えます待ち行列内にある)。 スレッドの実行は停止されません。 (CPUを解放するだけです)。 (http://en.cppreference.com/w/cpp/thread/yield

関連する問題