назначение функции wait_for в условной переменной - C ++ 11 - PullRequest
0 голосов
/ 11 декабря 2018

Я новичок в условных переменных, многопоточности и мьютексах, и у меня есть фундаментальный вопрос по этому поводу.

Цитата ru.cppreference.com on wait_for - "блокирует текущий поток до тех пор, пока переменная условия не будет разбужена или по истечении заданного времени ожидания ".

Почему текущий поток должен быть разблокирован через определенное время.Основное назначение условной переменной - уведомлять всякий раз, когда возникает «условие».Разве это не вызывает перегрузку, если поток просыпается, скажем, каждые 500 мс?Ложные пробуждения также встроены в качестве механизма безопасности на случай, если вызов для уведомления не происходит / не срабатывает и т. Д.

Я, очевидно, здесь упускаю что-то базовое, но не уверен, что это такое.Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

если поток просыпается, скажем, каждые 500 мс?

Это не так, как wait_for работает.Давайте пока проигнорируем ложные следы.Функция активируется при получении уведомления или по истечении таймера.Другой способ взглянуть на это: дождаться уведомления, но не дольше, чем rel_time время.

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

Ложные пробуждения - это нежелательные побочные эффекты от реалий современных программно-аппаратных архитектур. Этот ответ объясняет это довольно хорошо.

0 голосов
/ 11 декабря 2018

Вариант использования для этого: если вы хотите подождать, пока не произойдет событие, но не неопределенно.

Возможно, после истечения времени ожидания вы хотите уведомить пользователя о том, что получение результата занимает больше времени, чем ожидалось.,Возможно, вы хотите инициировать отмену задачи, обеспечивающей результат.

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

Ложные пробуждения - это не столько механизм безопасности, сколько скорее печальная необходимость, навязываемая некоторыми аппаратными архитектурами.В идеальном мире (т. Е. В мире, в котором вы когда-либо вызываете функции wait только с предикатом), никаких ложных пробуждений не происходит никогда.

...