Мне сообщили, что при написании специального кода на С++ для 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!
}