Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::在线程退出时通知所有线程如何工作?_C++_Multithreading_C++11_Standards_Language Implementation - Fatal编程技术网

C++ std::在线程退出时通知所有线程如何工作?

C++ std::在线程退出时通知所有线程如何工作?,c++,multithreading,c++11,standards,language-implementation,C++,Multithreading,C++11,Standards,Language Implementation,根据: std::在线程退出时通知所有线程提供通知其他线程的机制 给定线程已完全完成的线程,包括 正在销毁所有线程和本地对象 我知道std::notify\u all\u at\u thread\u exit的确切语义。令我困惑的是: 如何注册在给定线程完成并销毁其所有线程本地对象后调用的回调函数?std::notify_all_at_thread_exit在其第一个参数中引用一个条件变量。当线程退出时,它将对该条件变量调用notify_all,唤醒等待条件变量通知的线程 似乎没有一种直接的方法

根据:


std::在线程退出时通知所有线程
提供通知其他线程的机制 给定线程已完全完成的线程,包括 正在销毁所有线程和本地对象

我知道
std::notify\u all\u at\u thread\u exit
的确切语义。令我困惑的是:


如何注册在给定线程完成并销毁其所有线程本地对象后调用的回调函数?
std::notify_all_at_thread_exit
在其第一个参数中引用一个条件变量。当线程退出时,它将对该条件变量调用
notify_all
,唤醒等待条件变量通知的线程

似乎没有一种直接的方法来真正注册回调;您可能需要一个线程等待通知条件变量(使用与在线程退出时传递到
std::notify_all_的锁相同的锁)。当通知CV时,等待的线程应该验证唤醒不是虚假的,然后执行应该运行的所需代码

有关如何实现此功能的更多信息:
至少打开,调用,它将一对参数存储到一个向量(
\u Notify
)。线程死亡时,
\u thread\u struct\u imp
的函数将迭代此向量,并通知以这种方式注册的所有条件变量


同时,GNU stdc++使用了类似的方法:创建了一个
通知程序
对象,它在
\uuu线程出口注册
,它被设计为在线程出口运行时调用其析构函数,析构函数实际执行通知过程。我需要更仔细地研究
\uu线程出口
现在还没有完全了解它的内部工作。

如何保证在销毁所有线程本地对象后调用
notify_all
?如何在Linux/Windows下实现它?@xmllmx我在文章中添加了一个标准库实现如何实现这一点的概述。