Как работает std :: notify_all_at_thread_exit?

В соответствии с cppref:

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

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

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

2

Решение

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]