не будет бесконечный цикл ресурсов процессора?

Я планирую использовать повышение :: lockfree :: очередь для моего многопоточного приложения. пример повышения иллюстрирует потребление очереди без блокировки следующим образом:

boost::atomic<bool> done (false);
void consumer(void)
{
int value;
while (!done) {
while (queue.pop(value))
++consumer_count;
}

while (queue.pop(value))
++consumer_count;
}

мой вопрос эта часть:

    while (!done) {
//do something
}

Я обычно использовал condition variable для таких случаев простота приведенного выше фрагмента кода гораздо более заманчива, чем сложность условных переменных.

Хотя consumer будет иметь свой собственный поток (ы), он зацикливается почти на всю продолжительность программы. Я волнуюсь больше, потому что есть много раз, что //do something часть не вызывается (очередь пуста), и этот процесс тратит много времени ЦП, которое может быть передано другим потокам. Я прав? Является ЭТОТ обычная практика?

Мне нужен кто-то, чтобы сказать мне, что я не прав, и я не должен беспокоиться об этом так&так причины.
или же
предложи мне лучший подход.

Спасибо

1

Решение

Это очень распространенная практика для приложений, чувствительных к задержке, то есть приложений, для которых время, потраченное на пробуждение потока, недопустимо.

Да, в этом случае (это называется «вращение») время ЦП теряется для проверки логического значения. Взаимные блокировки реализованы аналогичным образом, что делает их предпочтительными в сценарии, где предпочтение отдается ожиданию занятости.

Когда задержка пути производителя к потребителю не является критичной, вы должны предпочесть условные переменные (или даже явный спящий режим) для совместного использования ЦП с другими потоками / процессами. И в любом случае, когда задержка критична, вам редко нужен контейнер без блокировки (который обычно создает значительные накладные расходы, чтобы избежать блокировки)

2

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

Если ожидание занятости более или менее эффективно, чем блокировка, зависит от того, как долго вы будете ждать в среднем. Некоторые итерации цикла могут быть быстрее, чем переключение контекста.

Смысл использования очереди без блокировки состоит в том, что она не имеет блокировки. Если вы хотите заблокировать, лучше использовать условную переменную, как вы предлагали, с другой очередью.

2