首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指向对象初始化的静态指针线程安全

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

Stack Overflow用户
提问于 2014-07-24 12:16:38
回答 1查看 1.2K关注 0票数 9

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

代码语言:javascript
运行
复制
void someFunc()
{
    static MyObject object;
}

但那又如何

代码语言:javascript
运行
复制
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来创建,而且构造函数永远不会从其他地方使用,那么这会是线程安全吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-24 13:08:00

是的,它是线程安全的。这与适用于第一个示例的保证相同,即函数的并发执行将精确地初始化静态变量一次。因为静态指针必须精确初始化一次,并且初始化它的方式被定义为对new的调用,所以new和它调用的构造函数都将被精确地调用一次。假设new对象的构造函数没有做任何不安全的事情,那么整个事情都是安全的。

感谢Matthieu M.指出了一个异常:如果初始化抛出,将在下次(待定或未来)调用函数时再次尝试。但是,它仍然是线程安全的,因为第二次尝试要到第一次失败之后才开始。

尽管如此,看到这样的代码还是令人担忧的,因为它可能会导致内存泄漏,而这种泄漏可能会被自动化工具(如valgrind )所标记,所以最好避免这种情况。即使是具有静态成员的类也可能更好,因为这样就更容易使用程序结束前调用的特殊方法来清除静态。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24933452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档