namespace std {
namespace this_thread {
void yield() noexcept;
}}
概要
処理系に再スケジュールの機会を与える。
効果
処理系に対して、再スケジューリングを行う機会を与える。たとえばオペレーティングシステムのスケジューラに対して、現スレッドに割り当てられたタイムスライスの破棄を指示し、他に実行可能なスレッドがあればそのスレッドに実行機会を与える。
同期
特に他操作と同期しない。
例外
送出しない。
備考
C++11標準の定義では処理系依存だが、その動作はPOSIXのsched_yield()
関数やWindows APIのSwitchToThread()
関数などを参考のこと。
Visual C++では、Windows APIのSleep()
関数を使った実装となっている。ただし、12.0でWindowsストア向けアプリケーションを対象とする場合は、Sleep()
関数が許可されていないため、WaitForSingleObject()
関数のタイムアウト時間に最小値1ミリ秒を指定して呼び出す実装となっている。
例
#include <thread>
#include <atomic>
#include <iostream>
std::atomic<bool> done(false);
int result;
int main()
{
std::thread t([]{
// 別スレッド上での処理...
result = 42;
done = true;
});
// ビジーループによる待機
while (!done) {
// yield()呼出により待機側スレッドのCPUリソース占有を避ける
std::this_thread::yield();
}
std::cout << "result=" << result << std::endl;
t.join();
}
出力
result=42
バージョン
言語
- C++11
処理系
- Clang:
- GCC: 4.6.3 ✅, 4.7.0 ✅
- ICC:
- Visual C++: 2012 ✅, 2013 ✅, 2015 ✅