是int吗?线程安全?

Jer*_*emy 24 .net c# int thread-safety

我知道,在.net所有32位类型(如int,bool等)是线程安全的.也就是说,不会有部分写入(根据规范).

但是,同样适用于int?(可空的int)吗?

Eri*_*ert 43

问题是措辞不力,因此到目前为止答案中的混乱.问题应该是"读取和写入int类型的变量?保证是原子的?"

不,绝对不是.关于这一点,规范非常明确:

以下数据类型的读取和写入是原子的:bool,char,byte,sbyte,short,ushort,uint,int,float和reference类型.此外,在先前列表中具有基础类型的枚举类型的读取和写入也是原子的.其他类型的读写,包括long,ulong,double和decimal,以及用户定义的类型,不保证是原子的.

线程完全可以从可空类型的共享内存变量中读取部分写入的值.

例如,假设你有一个int?变量x,目前的值为null.因此它包含一个设置为零的int和一个设置为false的bool.现在在另一个线程上,你可以将nullable int"5"写入x.另一个线程从x读取非可空int零是完全合法的,因为bool中的"true"可以在将5设置为int之前设置.

  • 那么,如果你有64位应用程序,读取和写入原子为双打? (7认同)
  • @EricLipper的答案 - 对于线程安全考虑较新的人来说,在答案中注意到读取和写入整数是原子的会有所帮助,递增原子整数不是原子的,因为它包括读写.我自己也对此感到困惑,并准备提出一个题为"如果Int是Atomic的话,使用Interlocked.Increment是什么?"的新问题. (3认同)
  • @William - 在Windows上,64位读取/写入在64位处理器上是原子的,当且仅当您创建64位应用程序时.如果您仍在编写32位应用程序(非常可能),即使在64位处理器上也没有64位原子性.我刚才问了一个问题:http://stackoverflow.com/questions/27533611/are-64-bit-operations-atomic-for-a-32-bit-app-on-64-bit-windows. (2认同)

Ant*_*hyy 12

不,因为a int?实际上是Nullable<int>由a int和a 组成的struct()bool.

  • @Eric:但是,除了转换运算符之外,`Nullable <T>`上没有公共静态成员. (2认同)