【问题标题】:.net System.MemberwiseClone and interlocked writes.net System.MemberwiseClone 和联锁写入
【发布时间】:2012-06-15 10:58:51
【问题描述】:

在执行值类型数组的 MemberwiseClone 时:

 var arr = new double[100];

如果在其他线程上使用 Interlocked 写入修改这些双精度,MemberwiseCloned 副本是否有任何损坏双精度的风险?我不关心有一点陈旧的值,只是撕裂以及 interlocked 和 memberwiseclone 之间的交互(我猜这会转化为内存 blit 类型的操作?)

【问题讨论】:

    标签: .net atomic interlocked


    【解决方案1】:

    是的。在 32 位操作系统上,这甚至可以保证有撕裂的风险。在 64 位上,它是实现定义的。我不会轻易冒险,因为即使您测试它不会发生,那么您的测试也只能在您的特定 .NET 版本和特定硬件上进行。 你无法确定。

    在 64 位上,您可以通过实现自己的克隆版本来可靠地防止撕裂(可能不会慢很多)。

    【讨论】:

    • 好的,所以我认为 32 位上的 memcpy 是在 32 位块中工作的,因此会降低双打的风险,而在 64 位上它将在 64 位级别上工作,所以应该是原子的每个价值?您将如何在 .net 中实现安全的 64 位克隆?
    • 使用 for 循环复制双打。简单的。你可以用同样的东西跑得更快 + 不安全的代码 + 循环展开 8 次。
    • 好的,所以 memcpy 不是单个 cpu 级别的内存 blit 类型命令,实际上是一个循环?
    • memcpy 有很多可能的实现。许多人甚至会在 32 位硬件上复制 64 位块(使用 SSE)。我的观点是你不能依赖它。因此,您需要自己滚动。基本上,每个 memcpy 都是一个紧密的循环。
    • 谢谢,不知道为什么我认为这是一些神奇的实现,因为你让我想起了我在 C++ 时代查看 memcpy 实现的记忆。
    猜你喜欢
    • 2011-12-04
    • 2014-11-10
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多