std::notify_all_at_thread_exit
принимает переменную условия в своем первом параметре по ссылке. Когда поток завершается, он вызывает notify_all
для этой условной переменной, вызывая потоки, которые ожидают уведомления условной переменной.
Кажется, нет прямого способа действительно зарегистрировать обратный вызов для этого; вам, вероятно, понадобится поток, ожидающий уведомления о условной переменной (используя ту же блокировку, что и в std::notify_all_at_thread_exit
. Когда CV получено уведомление, ожидающий поток должен убедиться, что пробуждение не является ложным , а затем выполните нужный код, который должен быть запущен.
Подробнее о том, как это реализовано:
По крайней мере, в Google libcxx , std::notify_all_at_thread_exit
вызывает __thread_struct_imp::notify_all_at_thread_exit
, в котором пара с параметрами хранится в векторе (_Notify
). После смерти потока деструктор из __thread_struct_imp
выполняет итерацию по этому вектору и уведомляет все переменные условия, которые были зарегистрированы таким образом.
Между тем, GNU stdc ++ использует аналогичный подход: создается объект notifier
, он регистрируется с помощью __at_thread_exit
, он предназначен для вызова своего деструктора при запуске на выходе из потока, а деструктор фактически выполняет процесс уведомления. Мне нужно исследовать __at_thread_exit
более внимательно, поскольку я пока не полностью понимаю его внутреннюю работу.