.NET多线程 - 我是否需要同步访问基本类型的变量?

Nei*_*ell 7 .net multithreading synchronization primitive-types

场景

我有一个bool Enabled属性的类,由另一个线程上的循环使用,以查看它是否应该停止.这个想法是一个不同的线程可以将该属性设置为false并停止另一个线程干净地运行.

这个问题

我是否应该Enabled使用类似的东西来序列化对该属性的访问lock (lockObject) { ... },或者它是否安全?

Bri*_*sen 6

原始类型读取是原子提供的,它们适合CPU读取.因此,32位原始类型读取在32位CPU上是原子的,而64位类型读取则不是.但是,除非它也是volatile你的其他线程可能看不到由于缓存的变化.

  • CLR保证所有托管变量都是字对齐的.如果你搞乱了指针和显式偏移,所有的赌注都会被取消. (3认同)
  • 这不完全正确.如果值的大小小于或等于CPU的位数,则只保证读/写是原子的.因此,在32位机器上读取/写入Int64将不是原子的. (2认同)