В соответствии с cppref:
std::notify_all_at_thread_exit
предоставляет механизм для уведомления других
потоки, которые данная нить полностью закончила, в том числе
уничтожить все объекты thread_local.
Я знаю точную семантику std::notify_all_at_thread_exit
, Что меня озадачивает, так это:
Как зарегистрировать функцию обратного вызова, которая будет вызываться после того, как данный поток завершит работу и уничтожит все свои локальные объекты потока?
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
более точно, поскольку я пока не полностью понимаю его внутреннюю работу.
Других решений пока нет …