33 Thread support library [thread]

33.5 Condition variables [thread.condition]

33.5.2 Non-member functions [thread.condition.nonmember]

void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);

Requires: lk заблокирован вызывающим потоком и либо

  • никакой другой поток не ждет cond, или

  • lk.mutex() возвращает то же значение для каждого из аргументов блокировки поставляемых все одновременно ожидания ( с помощью wait, wait_­for, или wait_­until) нитей.

Effects: Передает право владения блокировкой, связанной с, lk во внутреннюю память и расписания, cond чтобы получать уведомления, когда текущий поток завершается, после того, как все объекты продолжительности хранения потока, связанные с текущим потоком, были уничтожены. Это уведомление должно быть таким, как если бы:

lk.unlock();
cond.notify_all();

Synchronization: Подразумеваемый lk.unlock() вызов упорядочивается после уничтожения всех объектов с продолжительностью хранения потока, связанной с текущим потоком.

[ Note: Поставляемая блокировка будет удерживаться до тех пор, пока поток не завершится, и необходимо следить за тем, чтобы это не привело к возникновению тупиковой ситуации из-за проблем с упорядочением блокировок. После вызова notify_­all_­at_­thread_­exit рекомендуется как можно скорее выйти из потока и чтобы в этом потоке не выполнялись блокирующие или трудоемкие задачи. ]end note

[ Note: Пользователь несет ответственность за то, чтобы ожидающие потоки не ошибочно предполагали, что поток завершился, если они испытывают ложное пробуждение. Обычно это требует, чтобы ожидаемое условие удовлетворялось при удержании блокировки lk, и чтобы эта блокировка не снималась и не запрашивалась повторно перед вызовом notify_­all_­at_­thread_­exit. ] end note