gpt4 book ai didi

ios - 这种初始化单例线程的方法安全吗?

转载 作者:行者123 更新时间:2023-11-29 13:12:45 27 4
gpt4 key购买 nike

这是我们项目中的一个代码范围,我认为它不是线程安全的,因为范围

if(sharedHelper)
return sharedHelper;

会导致问题,但我不确定,有人可以帮助我吗?

+(id) sharedHelper
{
static MyHelper *sharedHelper = nil;
static dispatch_once_t onceToken;

if(sharedHelper)
return sharedHelper;

dispatch_once(&onceToken,^{

sharedHelper = [[self alloc] init];
});

return sharedHelper;
}

最佳答案

您认为 if block 可能会导致问题,这是正确的。原因如下 ( source ):

这一行

[[MyHelper alloc] init];

实际上由三个步骤组成:

  1. 分配内存
  2. 将对象构造到分配的内存中
  3. 将静态变量指向分配的内存地址

现在,您会期望这些事情按 1-3 的顺序发生。但是,在某些情况下,编译器可能重新排序指令,使第 3 步发生在第 2 步之前 -

sharedHelper = // Step 3
operator new(sizeof(MyHelper)); // Step 1
new (sharedHelper) MyHelper; // Step 2

现在,考虑这个场景:线程 1 执行步骤 1 和 3 并被挂起。所以静态变量指向一个还没有被初始化的内存位置。现在,如果线程 2 检查 if(sharedHelper),它会找到一个非 NULL 地址,并返回该地址。但是等等,这个地址还没有初始化 - BAM,你有一个 EXC_BAD_ACCESS。

同时检查这个相关的excellent answer .

关于ios - 这种初始化单例线程的方法安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16768250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com