2012-06-15 5 views
27

Я хотел знать, в чем разница между C++ 11 std::this_thread::yield() и std::this_thread::sleep_for()? И как решить, что использовать? Благодарю.std :: this_thread :: yield() vs 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 сообщает реализации перепланировать выполнение потоков, которые должны быть использованы в том случае, когда вы находитесь в занятом состоянии ожидания, как в пуле потоков:

... 
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 может быть использована, если вы действительно хочу подождать определенное количество времени. Это может быть использовано для задачи, где время действительно имеет значение, например: если вы действительно хотите только подождать 2 секунды. (Обратите внимание, что реализация может ждать дольше, чем заданная длительность времени)

+0

Итак, означает ли это, что std :: this_thread :: yield откажется от выполнения в течение некоторого времени и повторит попытку? Как работает нить, когда o попытается в следующий раз? – polapts

+4

@polapts Да, 'std :: this_thread :: yield' просто позволяет планировщику выполнять другой поток. Когда планировщик вернется к этому потоку, он будет работать только после вызова 'std :: this_thread :: yield' – inf

10

станд :: this_thread :: sleep_for()

сделает ваш сон нить в течение заданного времени (поток остановлен для заданное время). (http://en.cppreference.com/w/cpp/thread/sleep_for)

станд :: this_thread :: Выход()

остановит выполнение текущего потока и отдавать приоритет другого процесса/потоки (если есть и другие технологические потоки, ожидающие/в очереди). Выполнение потока не останавливается. (он просто освобождает процессор). (http://en.cppreference.com/w/cpp/thread/yield)

Смежные вопросы