При написании кода C++ для Microsoft мне сказали, что запись Sleep(1)
намного лучше, чем Sleep(0)
для спин-блокировки, из-за того, что Sleep(0)
будет использовать больше процессорного времени, более того, он уступает только при наличии другого равного-приоритета поток, ожидающий запуска.
Однако с библиотекой потоков С++ 11 не так много документации (по крайней мере, которую мне удалось найти) о влиянии std::this_thread::yield()
на std::this_thread::sleep_for( std::chrono::milliseconds(1) )
; второй, безусловно, более многословен, но одинаково ли они эффективны для спин-блокировки, или он потенциально страдает от тех же ошибок, что и Sleep(0)
против 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!
}
yield
иsleep_for(1ms)
- это совершенно разные семантики, в первом случае вы сообщаете реализации yield, которая может возвращаться и возвращаться через случайное время, а во втором случае говорится, что вы не хотите спать короче 1 мс. - person Stephan Dollberg   schedule 26.06.2013bSomeCondition
не является атомарным типом. - person zch   schedule 27.06.2013