yield
и notify_one
не связаны между собой.
yield
- это запрос процесса (к ОС) об отказе от текущего временного интервала.Тема все еще будет запланирована в следующий раз.Представьте, что процессу выделяется 10 мс.Если он вызывает yield
через 5 мс, ОС может запустить другой процесс.В следующий раз он по-прежнему получает полные 10 мсек.ОС не должна выполнять запрос.
condition_variable::notify_one
используется вместе с condition_variable::wait
.Если есть какие-либо ожидающие потоки, notify_one гарантированно разбудит один из них.Если нет ожидающих потоков, notify_one ничего не сделает.
Обратите внимание, что переменная условия при вызове wait должна использоваться с 1 мьютексом, который защищает некоторое общее состояние (условие ),и он ожидает, когда другой поток подаст сигнал, когда условие выполнено.
Возможен ли случай, когда поток A сигнализирует notify_one (), но все же поток A снова запланирован, даже если поток B готов?
Да.С семантикой Mesa, сигнализация ожидающего потока просто разблокирует другой поток.Текущий поток может продолжать работать, пока не истечет время.При семантике Hoare сигнальный поток немедленно переключается на ожидающий поток.Однако почти во всех реализациях условий используется семантика Mesa.
Являются ли notify_one () и yield () эквивалентными друг другу?
"Эквивалент" будет означать, что онисделать то же самое.Это не относится к делу.Я думаю, что вы хотите спросить, являются ли они бесплатными, или они являются частью той же схемы синхронизации, и ответ - нет, как я объяснил выше.
Если мы используем notify_one()
, чтобы разбудитьнам нужен поток yield()
Если нить A только что разбудила нить C с nofity_one
и вы хотите запустить нить C как можно скорее, вы можете позвонить yield
, чтобы получитьдо остальной части времени нити А.Однако ОС не обязана удовлетворять ваш запрос.И может быть много потоков, запланированных перед тем C, которые вы не можете контролировать.