2016-05-27 3 views
1

Как я понимаю, когда у меня есть коллекция нитей, защищенных std::lock_guard или std::unique_lock над std::mutex, и мьютексы разблокируются путем их явного разблокирования или блокировки, выходящей из области видимости, тогда уведомления о потоках уведомляются.Когда мьютексы разблокируются, это notify_all или notify_one?

Является ли это уведомление a notify_one или notify_all?

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

+0

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

+3

Вопрос не имеет смысла, поскольку 'notify_one' и' notify_all' являются функциями 'std :: condition_variable' not' std :: mutex'. –

+0

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

ответ

2

Что вы, кажется, спросить, является ли, когда нить T0 запер мьютекс M и нити T1..Tn заблокированные пытается заблокировать M, что происходит, когда T0 разблокирует M? Очевидно, что только один поток может успешно заблокировать M, поэтому нет никакой причины, чтобы система «уведомляла» (т. Е. Расписание) более одного официанта. Однако ваш вопрос не является специфическим для какой-либо одной платформы, поэтому ответ, возможно, должен быть «зависит от реализации».

+0

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

2

Это зависит от реализации. Ожидающие потоки могут активно ждать в пользовательском пространстве внутри контекста вызова mutex :: lock() в течение некоторого короткого времени для разблокировки мьютекса, и после его разблокировки несколько активно ожидающих потоков могут обнаружить его одновременно, но только один сможет заблокировать его. В противном случае после прохождения активного периода mutex.lock() выдает системный вызов, а ОС помещает поток в список ожиданий для этого мьютекса. Когда он разблокирован, только один поток получает/уведомляется, чтобы получить блокировку.

Смежные вопросы