Ios 我需要创建线程安全变量吗?

Ios 我需要创建线程安全变量吗?,ios,multithreading,Ios,Multithreading,我需要创建线程安全变量吗?我将仅在主线程和dispatch\u async(dispatch\u get\u main\u queue()中使用mydata 在这种情况下,我认为没有必要对mydata执行任何特殊操作,因为它只从主线程更新(假设mainThread意味着该方法只从主线程调用)。这还假设您除了从主线程之外,没有尝试从任何位置读取mydata 进一步解释: 尽管concurrentThread在主线程以外的线程上运行,但mydata=77出现在调度到主线程的块中这一事实意味着赋值将以

我需要创建线程安全变量吗?我将仅在主线程和dispatch\u async(dispatch\u get\u main\u queue()中使用mydata


在这种情况下,我认为没有必要对
mydata
执行任何特殊操作,因为它只从主线程更新(假设
mainThread
意味着该方法只从主线程调用)。这还假设您除了从主线程之外,没有尝试从任何位置读取
mydata

进一步解释:


尽管concurrentThread在主线程以外的线程上运行,但
mydata=77
出现在调度到主线程的块中这一事实意味着赋值将以某种串行顺序在主线程上实际发生,同时在主线程上发生对该变量的任何其他读/写d、 因此,假设除主线程之外的任何地方都没有访问mydata的代码,则此代码是安全的。

在主线程更新变量时,它不会保护任何其他线程在尝试读取时读取垃圾。我在这里看不到任何对主线程之外的
mydata
变量有任何作用的代码。如果你正在假设他是否从其他地方读取变量,那么情况就不同了。这是在另一个线程(即不是主线程)上运行的一段代码。但是,出现在concurrentThread中的对mydata的分配实际上是在主线程上进行的。我明白了,该分配使两个分配都发生在主线程上。@SteveTownsend Yup。这是一种相当常见的模式,特别是当您需要从主线程以外的线程更新UI时。
-(void) mainThread
{
 mydata = 55;
}

-(void) concurrentThread
{
 dispatch_async(dispatch_get_main_queue(), ^
 {
  mydata = 77;                          
 });
}