C# 64位cpu上64位值的读/写是原子的吗?

C# 64位cpu上64位值的读/写是原子的吗?,c#,.net,atomic,32bit-64bit,C#,.net,Atomic,32bit 64bit,在32位机器上,在.net中读取和写入64位值过去是非原子的,也就是说,在读取时,我可以读取从未写入内存的值,包括一个较旧的32位值和一个较新的值 但是在64位CPU上读/写是原子的吗 如果是这样,(Windows)操作系统也必须是64位的吗 如果是这样的话,应用程序是否也必须是64位的.net版本 从中,如果您在64位系统上并使用64位CLR,则它们是原子的。答案引用了Eric Lippert的这篇博文: CLI规范实际上提供了更有力的保证。CLI保证对处理器自然指针大小(或更小)的值类型变量

在32位机器上,在.net中读取和写入64位值过去是非原子的,也就是说,在读取时,我可以读取从未写入内存的值,包括一个较旧的32位值和一个较新的值

  • 但是在64位CPU上读/写是原子的吗
  • 如果是这样,(Windows)操作系统也必须是64位的吗
  • 如果是这样的话,应用程序是否也必须是64位的.net版本
  • 从中,如果您在64位系统上并使用64位CLR,则它们是原子的。答案引用了Eric Lippert的这篇博文:

    CLI规范实际上提供了更有力的保证。CLI保证对处理器自然指针大小(或更小)的值类型变量的读写是原子的;如果在64位版本的CLR中的64位操作系统上运行C#代码,则64位双精度和长整数的读写也保证是原子的。C语言不能保证这一点,但运行时规范可以保证。(如果您在某些环境中运行的C#代码不是由CLI的某些实现实现实现的,那么您当然不能依赖该保证;如果您想知道他们提供了什么保证,请与向您出售运行时的供应商联系。)


    我不知道1,但我可以告诉你2和3是必需的。您需要一个64位操作系统中的64位应用程序CPU@CamiloTerevinto我读了标签
    32bit-64bit
    ,因为我发现它实际上与这个问题有关。define
    无用的
    。@Christopher:这个问题不是关于数据库意义上的原子性,而是关于读取意义上的原子性。关键是我们不需要考虑像读增量写这样的复杂操作来获得意想不到的结果。如果读和写不是原子的,即使是在一个线程上读,在另一个线程上写,也会产生意想不到的结果。我不知道为什么这个问题会因为离题而获得接近票数的投票。这是一个关于线程(UpVote)的好问题和有趣的性能问题,也是昨天提出的一个延续和相关问题,注意读写必须对齐。如果(比如)你正在解引用一个指向奇数地址的四字节结构的指针,处理器就可以中断读取。我想在64位版本的CLR中运行C代码[…]将排除在64位CLR中运行的32位构建(通过WOW64)。