std::notify_all_at_thread_exit 是如何运作的?

How does std::notify_all_at_thread_exit work?

根据cppref

std::notify_all_at_thread_exit provides a mechanism to notify other threads that a given thread has completely finished, including destroying all thread_local objects.

我知道 std::notify_all_at_thread_exit 的确切语义。让我不解的是:

如何注册在给定线程完成并销毁其所有线程局部对象后调用的回调函数?

std::notify_all_at_thread_exit 通过引用在其第一个参数中采用条件变量。当线程退出时,它将对该条件变量调用notify_all,唤醒等待条件变量被通知的线程。

似乎没有真正为此注册回调的直接方法;您可能需要有一个线程等待条件变量被通知(使用与传递到 std::notify_all_at_thread_exit 的锁相同的锁)。当 CV 被通知时,正在等待的线程应该验证唤醒是' t spurious,然后执行应该是 运行.

的所需代码

有关如何实施的更多信息:
至少 __thread_struct_impGoogle's libcxx, std::notify_all_at_thread_exit calls __thread_struct_imp::notify_all_at_thread_exit, which stores a pair with the parameters to a vector (_Notify). Upon thread death, the destructor 遍历此向量并通知所有已以这种方式注册的条件变量。

与此同时,GNU stdc++ 使用类似的方法:创建一个 notifier 对象,将其注册到 __at_thread_exit,它被设计为在线程退出 运行 时调用其析构函数,并且析构函数实际上执行通知过程。我需要更仔细地调查 __at_thread_exit,因为我还不完全了解它的内部工作原理。