Суть в том, чтобы узнать более эффективное решение для реализации цикла ожидания, который опрашивает условие на каждой итерации. Под эффективными я подразумеваю «эффективные для планирования ЦП».
Я знаю, что условие ожидания, используемое в моем коде, не является «условием реального ожидания», используемым с инструкцией «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
Редакция:
Обе версии идентичны, поскольку оба «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). С другой стороны, условная переменная будет ждать столько, сколько вы запросили если он получает уведомление о том, что условие могло измениться.
Других решений пока нет …