微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++并发销毁

如何解决C ++并发销毁

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

•定义一个静态持续时间对象,该对象列出了针对 声明顺序对象组。将此清单称为 声明-析构函数列表。

•定义一个静态持续时间对象,该对象列出了针对 执行顺序的对象未在 声明顺序初始化。将此清单称为 执行析构函数列表。

•定义一个列出未决销毁的线程持续时间对象。 将此列表称为线程破坏程序列表。

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

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

•在完成初始化区域时,以原子方式移动 线程-析构函数列表到声明-析构函数列表中 组。代码可以像在原子上插入原子一样简单 静态分配节点的单链接列表。原子的 插入可以通过比较和交换与释放循环来完成, 将迅速终止。循环开头的读取获取将是 在遍历列表之前是必需的。

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

•在程序退出时,遍历执行析构函数列表,然后 调用相应的析构函数。完成这些之后,遍历 声明-析构函数列表并启动相应的组 同时破坏。在每个组中,依次遍历 析构函数列表。

“并发破坏”是什么意思,应如何实现?

解决方法

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

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

static MyClass myGlobal;

正如论文所讨论的,str有时需要销毁,如果在发生这种情况后调用func(),那就是个问题。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。