Нить сна VS ожидание

Суть в том, чтобы узнать более эффективное решение для реализации цикла ожидания, который опрашивает условие на каждой итерации. Под эффективными я подразумеваю «эффективные для планирования ЦП».

Я знаю, что условие ожидания, используемое в моем коде, не является «условием реального ожидания», используемым с инструкцией «wakeOne» / «wakeAll», но я хочу знать, является ли использование ложного условия ожидания более эффективным для ЦП, чем режим сна.

Вот 2 фрагмента кода, которые делают то же самое: ждите, пока что-то случится. Этот код используется в пуле рабочих потоков. Поэтому, когда поток ожидает, другие (или некоторые другие) должны обработать свои инструкции.

Первый использует «сон», второй — «условие ожидания».
Они написаны с использованием Qt, но могут быть легко переведены на C ++ 11, Boost или любую библиотеку потоков.

Оба хорошо работают, но есть ли разница в производительности? Я помню, что я где-то читал:

«Сон» вызывает активное ожидание, поэтому процессор тратит время на ожидание.

«Условие ожидания» заставляет ЦП ожидать события, поэтому ЦП переключается на выполнение другого потока во время ожидания.

Я хорошо помню? Это правда ? Использование условия ожидания более эффективно для параллельного выполнения нескольких потоков?

«Спящая» версия:

while (someCondition == false)
{
sleep(100);
}

// Do some work

Версия «WaitCondition»:

QMutex mutex(QMutex::NonRecursive);
QWaitCondition waitCondition;

while (someCondition == false)
{
QMutexLocker locker(&mutex);
waitCondition.wait(&mutex, 100);
}

// Do some work

5

Решение

Редакция:

Обе версии идентичны, поскольку оба «block» или «suspend» (то есть — удаляют его из списка «runnable» в планировщике) вызывающего потока.

http://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_timedwait.html

Во время сна и ожидания CV поток не использует тактовые циклы процессора.

ОРИГИНАЛ:

Разница значительна. Первый пример (со сном) будет реагировать на событие в течение 0-100 мс. Другой — с переменной условия — будет реагировать «мгновенно». Это связано с тем, что режим сна будет работать именно так — в режиме ожидания в течение именно того времени, которое вы запрашивали (обратите внимание — давайте предположим, что ваша система не использует сигналы в стиле POSIX). С другой стороны, условная переменная будет ждать столько, сколько вы запросили если он получает уведомление о том, что условие могло измениться.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]