Как работает std :: notify_all_at_thread_exit? - PullRequest
0 голосов
/ 02 сентября 2018

Согласно cppref :

std::notify_all_at_thread_exit предоставляет механизм для уведомления других потоки, которые данная нить полностью завершила, в том числе уничтожение всех объектов thread_local.

Я знаю точную семантику std::notify_all_at_thread_exit. Что меня озадачивает:

Как зарегистрировать функцию обратного вызова, которая будет вызываться после того, как данный поток завершит работу и уничтожит все его локальные для потока объекты?

1 Ответ

0 голосов
/ 02 сентября 2018

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 более внимательно, поскольку я пока не полностью понимаю его внутреннюю работу.

...