Мне сообщили, что при написании специального кода на С++ для Microsoft, который пишет Sleep(1), намного лучше, чем Sleep(0) для спин-блокировки, из-за того, что что Sleep(0) будет использовать большее количество процессорного времени, более того, оно будет выдаваться только в том случае, если ожидается ожидание очередного потока с равным приоритетом.
Однако, с библиотекой потоков С++ 11, документация (по крайней мере, что мне удалось найти) не так много, о возможностях std::this_thread::yield() vs. std::this_thread::sleep_for( std::chrono::milliseconds(1) ); второй, безусловно, более многословный, но оба они одинаково эффективны для спин-блокировки или же они страдают от потенциально тех же самых ошибок, которые затронули Sleep(0) vs. Sleep(1)?
Пример цикла, в котором допустимы либо std::this_thread::yield(), либо std::this_thread::sleep_for( std::chrono::milliseconds(1) ):
void SpinLock( const bool& bSomeCondition )
{
// Wait for some condition to be satisfied
while( !bSomeCondition )
{
/*Either std::this_thread::yield() or
std::this_thread::sleep_for( std::chrono::milliseconds(1) )
is acceptable here.*/
}
// Do something!
}