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

jas*_* na 5 objective-c objective-c++ static-initialization

注意:我使用的是Objective-C ++,其中允许使用非编译时常量(/sf/answers/861337081/

+ (Foo)sharedFoo
{ 
    static Foo *foo = [Foo new];
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

静态初始化程序只能运行一次,但是它是否具有线程安全性,例如,如果多个线程同时调用+(Foo)sharedFoo,是否可以保证[Foo new]仅运行一次?

我问是因为如果这样,那么为什么建议obj-C中的单例模式使用如下所示的dispatch_once呢?

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

    return foo;
}
Run Code Online (Sandbox Code Playgroud)

我本质上是在问为什么第一行不能只是

static Foo *foo = [Foo new];
Run Code Online (Sandbox Code Playgroud)

如果我们知道静态本地var初始化仅运行一次,则只需完全跳过dispatch_once。

编辑:好的,我找到了答案。1.首先,我意识到我使用的是Objective-C ++,它允许上述代码进行编译(并在运行时运行)2.第二,编译器将该代码转换为不带dispatch_once的单例初始化器的“原始”版本,从而使它确实不是线程安全的。

Hus*_*bir 0

Is local static variable initialization thread safe?
Run Code Online (Sandbox Code Playgroud)

简短回答:-

不,它不是线程安全的。