Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是int吗?线程安全?_C#_.net_Thread Safety_Int - Fatal编程技术网

C# 是int吗?线程安全?

C# 是int吗?线程安全?,c#,.net,thread-safety,int,C#,.net,Thread Safety,Int,我知道在.Net中,所有32位类型(例如,int,bool等)都是线程安全的。也就是说,不会有部分写入(根据规范) 但是,这是否同样适用于int?(可空int)?否,因为int?实际上是由int和bool组成的结构(null): 此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何 实例成员不能保证是线程安全的 这个问题措词不当,因此迄今为止的答案很混乱。问题应该是“对int类型变量的读写是否保证是原子的?” 不,绝对不是。规范在这一点上非常明确: 以下数据类型的读写

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


但是,这是否同样适用于
int?
(可空int)?

否,因为
int?
实际上是由
int
bool

组成的结构(
null
):

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何 实例成员不能保证是线程安全的


这个问题措词不当,因此迄今为止的答案很混乱。问题应该是“对int类型变量的读写是否保证是原子的?”

不,绝对不是。规范在这一点上非常明确:

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

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


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

问题是
null
没有公共静态成员(除非您将转换操作符计算到
T
本身)。这只是MSDN上大多数对象的文档中的样板文本。它是通用文档副本这一事实是否会降低其准确性?@Eric:但是,除了转换运算符,
Nullable
上没有公共静态成员@LukeH:这与问题有什么关系?@Eric:我的评论是对另一个Eric之前的评论(删除后)的回应,声称
int?
类型的一些成员——公共静态成员——是线程安全的。我理解您的int?示例。。但是为什么对长、双精度和十进制的读/写不是原子的?@MalcomTucker:32位处理器只保证对32位变量的操作是原子的。Long、double和decimal可能需要多个操作来写入或读取整个值,因为它们大于32位。因此,如果您有一个64位应用程序,那么对于double,64位读/写是原子的吗?@William-在Windows上,当且仅当您创建一个64位应用程序时,64位读/写在64位处理器上是原子的。如果您仍在编写32位应用程序(很可能),则即使在64位处理器上也没有64位原子性。不久前我问了一个问题:.@EricLipper的答案-对于那些刚开始考虑线程安全的人来说,在答案中注意到虽然对整数的读写是原子的,但增加一个原子整数并不是原子的,因为它包括读写。我自己对此感到困惑,正要问一个新问题,题为“Interlocked.Increment如果Int是原子的,它有什么用?”。