在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来创建,而且构造函数永远不会从其他地方使用,那么这会是线程安全吗?
发布于 2014-07-24 13:08:00
是的,它是线程安全的。这与适用于第一个示例的保证相同,即函数的并发执行将精确地初始化静态变量一次。因为静态指针必须精确初始化一次,并且初始化它的方式被定义为对new的调用,所以new和它调用的构造函数都将被精确地调用一次。假设new对象的构造函数没有做任何不安全的事情,那么整个事情都是安全的。
感谢Matthieu M.指出了一个异常:如果初始化抛出,将在下次(待定或未来)调用函数时再次尝试。但是,它仍然是线程安全的,因为第二次尝试要到第一次失败之后才开始。
尽管如此,看到这样的代码还是令人担忧的,因为它可能会导致内存泄漏,而这种泄漏可能会被自动化工具(如valgrind )所标记,所以最好避免这种情况。即使是具有静态成员的类也可能更好,因为这样就更容易使用程序结束前调用的特殊方法来清除静态。
https://stackoverflow.com/questions/24933452
复制相似问题