指向对象初始化线程安全的静态指针

弗拉基米尔

在C ++ 11中,以下是线程安全的:

void someFunc()
{
    static MyObject object;
}

但是关于

void someFunc()
{
    static MyObject *ptr = new MyObject();
}

那么这是线程安全的吗?

正如@Nawaz在评论中提到的那样,很可能MyObject构造函数不是线程安全的,因此让我们将问题分为几部分:

1)如果ctor是线程安全的(它不访问任何共享状态),那么此static MyObject *ptr = new MyObject();线程安全吗?换句话说,static int *ptr = new int(0);线程安全吗?

2)如果ctor不是线程安全的,但是仅通过someFunc从不同线程进行调用创建了对象,并且构造函数从未在其他任何地方使用,那么这将是线程安全的吗?

约翰·兹温克

是的,它是线程安全的。这是从与第一个示例相同的保证得出的,该保证是函数的并发执行将只对静态变量进行一次初始化。由于必须将静态指针初始化一次,并且将其初始化的方式定义为对的调用,因此new静态指针new将分别调用一次。假设new对象的构造函数不会做任何不安全的事情,那么整个事情将是安全的。

感谢Matthieu M.指出一个例外:如果引发初始化,将在下一次(挂起或将来)调用该函数时再次尝试进行初始化。但是,它仍然是线程安全的,因为第二次尝试直到第一次尝试失败后才开始。

话虽如此,看到这样的代码令人担忧,因为它似乎可能导致内存泄漏,并可能被诸如valgrind之类的自动化工具标记出来,因此最好避免这种情况。甚至具有静态成员的类也可能更好,因为这样,在程序结束之前使用特殊方法清理静态对象将变得更加容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

初始化指向对象数组的指针

来自分类Dev

初始化指向对象数组的指针

来自分类Dev

C++:使用指向大型静态数组的指针安全地初始化类

来自分类Dev

初始化对象的Java线程安全

来自分类Dev

初始化指向同名函数的静态成员函数指针

来自分类Dev

使用指向extern变量的指针进行静态初始化

来自分类Dev

静态初始化的不安全调用的线程安全

来自分类Dev

在Objective-C中初始化和使用线程安全静态对象

来自分类Dev

从非线程安全的方法初始化静态Java常量

来自分类Dev

线程安全Singletion静态方法初始化

来自分类Dev

局部静态变量初始化是线程安全的

来自分类Dev

C ++ 11初始化指向对象的指针的列表

来自分类Dev

指向类对象的空指针:函数内部的初始化

来自分类Dev

在 C 中初始化指向常量对象的常量指针

来自分类Dev

初始化指向 struct 的指针的指针

来自分类Dev

初始化指向指针的指针向量

来自分类Dev

使用静态或全局对象初始化共享指针

来自分类Dev

初始化指向nullpointer的指针数组

来自分类Dev

结构初始化指向NULL的指针

来自分类Dev

指向双重初始化的指针

来自分类Dev

初始化指向数组C ++的指针

来自分类Dev

初始化指向 typedef 结构的指针

来自分类Dev

初始化指向数组的指针

来自分类Dev

使用指向外部变量的指针进行静态初始化

来自分类Dev

使用指向外部结构元素的指针进行静态数组初始化?

来自分类Dev

静态指针初始化在“初始化”之后重置

来自分类Dev

用指向派生类的指针初始化auto_ptr是否安全?

来自分类Dev

初始化静态指针数组

来自分类Dev

初始化类中的静态指针

Related 相关文章

热门标签

归档