我正在阅读使用并发的动态初始化和销毁和下面的有关销毁命令的实现:
·定义一个静态持续时间对象,该对象列出声明有序对象组的待定销毁。将此列表称为声明-析构函数列表。 ·定义一个静态持续时间对象,该对象列出未在声明顺序初始化上下文中初始化的执行有序对象的挂起销毁。将此列表称为执行-析构函数列表。 ·定义一个列出挂起的销毁的线程持续时间对象。将此列表称为线程-析构函数列表。 ·当启动一组相对有序的对象的初始化时,创建一个空的线程析构函数列表。在这组对象初始化的动态范围内执行的静态持续时间对象初始化集合称为初始化区域。 ·对于初始化区域内的每个动态初始化,非原子性地将销毁插入到线程-析构函数列表的顶部。此列表将捕获由于初始化非本地对象而初始化的函数本地对象。代码可以很简单,就像插入到具有静态分配节点的单链接列表上一样。 ·当完成初始化区域时,原子地将线程析构函数列表作为一个组移到声明-析构函数列表中。代码可以像原子插入到具有静态分配节点的单链接列表中一样简单。原子插入可以通过比较和交换释放循环来完成,这个循环将迅速终止.在遍历列表之前,必须先在循环的头上进行读取。 ·对于不在初始化区域内的每个动态初始化,原子地在执行-析构函数列表的顶部插入销毁。代码可以像原子插入到具有静态分配节点的单链接列表中一样简单。插入具有与上面相同的基本算法。 ·在程序退出时,迭代执行-析构函数列表并调用相应的析构函数。完成这些操作后,迭代声明-析构函数列表,并同时启动相应的组销毁。在每个组中,依次遍历析构函数列表。
具有并发性的销毁意味着什么以及应该如何实施?
发布于 2020-09-20 06:33:45
您所链接的这篇文章是关于某些类型的建筑和破坏,包括全局静力学和功能范围内的静力学,例如:
class MyClass {
const std::string& func() {
static std::string str = "";
str.push_back('?');
return str;
}
};
static MyClass myGlobal;正如本文所讨论的,在某个时候需要销毁str,如果在此之后调用func(),则是一个问题。
本文针对的是编译器编写人员,而不是应用程序程序员。在编写应用程序甚至大多数库代码时,通常不需要担心这些问题--特别是在避免使用全局和函数级静态变量的情况下。
https://stackoverflow.com/questions/63975265
复制相似问题