Objective c 目标c-局部静态变量初始化是否线程安全?

Objective c 目标c-局部静态变量初始化是否线程安全?,objective-c,objective-c++,static-initialization,Objective C,Objective C++,Static Initialization,注意:我使用的是objective-c++,其中允许使用非编译时常量() 静态初始值设定项预计只运行一次,但它是线程安全的吗?如果多个线程同时调用+(Foo)sharedFoo,是否保证[Foo new]只运行一次 我这样问是因为如果是这样,那么为什么建议obj-C中的单例模式像下面这样使用dispatch_ + (Foo)sharedFoo { static Foo *foo = nil; static dispatch_once_t onceToken; dispat

注意:我使用的是objective-c++,其中允许使用非编译时常量()

静态初始值设定项预计只运行一次,但它是线程安全的吗?如果多个线程同时调用+(Foo)sharedFoo,是否保证[Foo new]只运行一次

我这样问是因为如果是这样,那么为什么建议obj-C中的单例模式像下面这样使用dispatch_

+ (Foo)sharedFoo {
    static Foo *foo = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        foo = [Foo new];
    });

    return foo;
}
我本质上是在问为什么第一行不能

static Foo *foo = [Foo new];
如果我们知道静态局部var初始化只运行一次,那么只需跳过dispatch_一次

编辑:啊,好的,我找到了答案。 1.首先,我意识到我正在使用objective-c++来编译上述代码(并在运行时运行) 2.其次,编译器将该代码转换为单例初始值设定项w/o dispatch_的“朴素”版本,这样它确实不是线程安全的

Is local static variable initialization thread safe?
简短答覆:


不,它不是线程安全的。

[Foo new]
不是原子的,在
[Foo new]
返回之前可能会有另一个线程调用
sharedFoo
。如果您这样写
静态Foo*Foo=[Foo new]
,您是否遇到编译错误
初始值设定项元素不是编译时常量
?啊-我刚检查过,我们使用的是objective-c++所以它确实允许(我不明白为什么我的项目允许这样做)并查找有关c++静态初始值设定项的信息,我发现它确实不是线程安全的。谢谢自C++11以来,局部静态变量初始化是线程安全的。您可以将Xcode/Clang配置为在Objective-C++项目中使用C++11(或C++14)方言。因此,从理论上讲,它在“Objective-C++11”中是安全的。尽管如此,请记住Objective-C++的确切行为并没有很好的文档记录。。。
Is local static variable initialization thread safe?