objective c - 是本地静态变量初始化线程安全吗?

时间:2014-08-11 00:28:07

标签: objective-c objective-c++ static-initialization

注意:我正在使用objective-c ++,其中允许非编译时常量(https://stackoverflow.com/a/12304815/3101492

+ (Foo)sharedFoo
{ 
    static Foo *foo = [Foo new];
    return foo;
}

静态初始化程序只能运行一次,但它是否是线程安全的,如果多个线程同时调用+(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;
}

我基本上问为什么第一行不能

static Foo *foo = [Foo new];

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

编辑:啊好的,我找到了答案。 1.首先,我意识到我正在使用objective-c ++,它允许上面的代码进行编译(并在运行时运行它) 2.第二,编译器将该代码转换为"天真的"没有dispatch_once的单例初始化程序的版本,因此它确实不是线程安全的。

1 个答案:

答案 0 :(得分:0)

Is local static variable initialization thread safe?

简短回答: -

不,它不是线程安全的。