std::notify_all_at_thread_exit 如何工作?

How does std::notify_all_at_thread_exit work?

本文关键字:工作 何工作 exit all notify at thread std      更新时间:2023-10-16

根据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 时,正在等待的线程应验证唤醒是否不是虚假的,然后执行应运行的所需代码。

关于如何实现这一点的更多信息:
至少在谷歌的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,因为我还没有完全了解它的内部工作原理。