C++ 并发销毁

Posted

技术标签:

【中文标题】C++ 并发销毁【英文标题】:C++ Destruction with Concurrency 【发布时间】:2020-09-20 03:34:51 【问题描述】:

我正在阅读Dynamic Initialization and Destruction with Concurrency,下面是关于销毁顺序的实现:

• 定义一个静态持续时间对象,该对象列出待处理的销毁 声明排序的对象组。将此列表称为 声明-析构函数列表。

• 定义一个静态持续时间对象,该对象列出待处理的销毁 未在 a 的上下文中初始化的按执行顺序的对象 声明顺序初始化。将此列表称为 执行析构函数列表。

• 定义一个列出待处理破坏的线程持续时间对象。 将此列表称为线程析构函数列表。

• 当开始初始化一组相对有序的 对象,创建一个空的线程析构函数列表。该组 在动态中执行的静态持续时间对象初始化 这组对象的初始化范围称为 初始化区域。

• 对于初始化区域内的每个动态初始化, 非原子地在头部插入破坏 线程析构函数列表。此列表将捕获函数本地 由于初始化的结果而初始化的对象 非本地对象。代码可以像插入到 具有静态分配节点的单链表。

• 当完成一个初始化区域时,原子地移动 线程析构函数列表作为声明析构函数列表 团体。代码可以像原子插入一样简单 具有静态分配节点的单链表。原子的 插入可以通过一个比较和交换与释放循环来完成,它 将迅速终止。循环头部的读取获取将是 在遍历列表之前是必需的。

• 对于不在初始化区域内的每个动态初始化, 原子地在头部插入破坏 执行析构函数列表。代码可以像原子一样简单 插入到具有静态分配节点的单链表中。 插入的基本算法和上面一样。

• 在程序退出时,遍历执行析构函数列表并 调用相应的析构函数。完成后,迭代 声明-析构函数列表并启动相应的组 同时销毁。在每个组内,依次迭代 析构函数列表。

Destruction with Concurrency 是什么意思,应该如何实现?

【问题讨论】:

“提供一些例子”在这里并不是一个真正有效的问题。您能否将您的问题重新表述为具体而简洁,而不是在别处写成一堵墙? 并发破坏是什么意思?抱歉,因为我自己无法理解该主题,因此要求用一些示例进行解释?示例使理解更简单 【参考方案1】:

您链接的论文是关于某些类型的构造和破坏,包括全局静态和函数范围的静态,例如:

class MyClass 
    const std::string& func() 
        static std::string str = "";
        str.push_back('?');
        return str;
    
;

static MyClass myGlobal;

正如论文所讨论的,在某些时候需要销毁 str,如果在此之后调用 func(),这是一个问题。

本文针对的是编译器编写者,而不是应用程序程序员。在编写应用程序甚至大多数库代码时,您通常不需要担心这些事情——尤其是在您避免多线程使用全局和函数级静态变量时。

【讨论】:

以上是关于C++ 并发销毁的主要内容,如果未能解决你的问题,请参考以下文章

并发编程之线程创建到销毁常用API

python 并发编程 多线程 守护线程

Java并发 - 线程池的使用

Python并发编程—进程池

并发编程

让有状态的节点变成无状态的节点才能更好的应对高并发