std::notify_all_at_thread_exit 如何工作?
How does std::notify_all_at_thread_exit work?
根据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
,因为我还没有完全了解它的内部工作原理。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个