6

我正在查看http://msdn.microsoft.com/en-us/library/aa691278(VS.71).aspx,它说 int 的读写是原子的,而 long 的读写可能不是。对于 64 位平台真的是这样吗?是不是 IntPtr.Size == 64 位或长?我是否遗漏了什么或语言规格不够完整?

这里还有更多想法:http: //philosopherdeveloper.wordpress.com/2011/02/08/beware-assignment-atomic-assignment/

4

2 回答 2

13

long是在具有 64 位字的 CPU 和平台上进行的原子写入。例如,如果您在 64 位计算机上运行 32 位 .NET 应用程序,写入long不是原子的。

请注意,如果您不能确保编译器不会优化对该类型变量的访问,那么原子性几乎毫无意义。例如,你不能longvolatile.

仅在 64 位运行时环境中保证对 64 位字段的操作是原子的

http://www.albahari.com/threading/part4.aspx

如果您在 64 位版本的 CLR 中在 64 位操作系统上运行 C# 代码,那么 64 位双精度和长整数的读写也保证是原子的

http://blogs.msdn.com/b/ericlippert/archive/2011/05/31/atomicity-volatility-and-immutability-are-different-part-two.aspx

于 2012-09-18T23:35:45.447 回答
1

那是对应于 .NET Framework 1.1 的 VS2003 的文档,它仅提供 32 位版本(暂时忽略非常利基的 IA-64 版本)。

.NET Framework 2.0 引入了 x64 版本,其中(只要您在 64 位模式下运行)那么某些(但不是全部)Int64 操作将是原子的。

当然,如果你想确定,使用Interlocked类。

于 2012-09-18T23:37:07.633 回答