我是否需要为简单变量添加线程锁定?

weu*_*uhi 9 multithreading thread-safety ios swift

假设我有一个对象,多个线程可以读取/写入statesomeValue变量.如果这些变量是int,double,enums等类型,我是否需要添加锁定?

enum State: String {
  case one
  case two
}

class Object {
  var state: State
  var someValue: Double
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*myP 6

是的你是.

想象一下两个线程试图添加1的情况someValue.一个线程执行此操作:

  1. someValue入寄存器
  2. 加1
  3. someValue

如果两个线程在执行操作3之前执行操作1,则将获得与在另一个线程执行操作1之前一个线程完成所有三个操作的情况不同的答案.

还有一些更微妙的问题,因为优化编译器可能不会在一段时间内将修改后的值写回寄存器 - 如果有的话.此外,现代CPU具有多个核心,每个核心都有自己的缓存.CPU将值写回内存并不能保证它能够立即进入内存.它可能只是核心的缓存.您需要所谓的内存屏障,以确保将所有内容整齐地写回主内存.

在更大的范围内,您需要锁定以确保类中变量之间的一致性.因此,如果状态是要表示某些属性,someValue例如它是否为整数,则需要锁定以确保每个人始终具有一致的视图,即

  1. 修改 someValue
  2. 测试新值
  3. 相应地设定state.

上述三个操作必须看起来是原子的,或者如果在操作1之后但在操作3之前检查对象,则它将处于不一致状态.