【问题标题】:Private copy of data from shared location来自共享位置的数据的私有副本
【发布时间】:2012-02-15 10:49:33
【问题描述】:

我现在正在阅读 Joe Duffy 的 Concurrent Programming on Windows,并看到以下声明:

多个线程从共享位置制作数据的私有副本

这个陈述是在一个示例之后给出的,其中 Joe 展示了如何从多个线程递增全局变量会导致不可预测的结果,因为它们可能会在时间上重叠。

但我仍然对该声明持怀疑态度,因为不存在诸如原子数据类型的私有副本之类的东西 - 这会使它成为非原子的。

所以当他说make private copies of data from a shared location 时,他的意思是所有非原子数据类型(用户定义类型等),还是我错过了什么?

【问题讨论】:

  • 不,它的所有数据类型。 c# 中的 volatile 关键字应该强制线程在每次引用它时获取该变量的最新值。 igoro.com/archive/volatile-keyword-in-c-memory-model-explained
  • @Kell,根据 C# 规范,int 是原子的(读/写)。根本没有意义,首先将静态 int 字段的值移动到给定线程使用的处理器的本地寄存器中,修改值(不是递增/递减 - 只是一个简单的写入),然后最后更新共享具有新值的内存位置。 - 这不是原子的,这是 3 条指令。
  • @Kell volatile 关键字的意思是“使用发布和获取”语义,仅此而已。它意味着线程将在引用该变量时获得该变量的最新值。见Volatile reads and writes (Joe Duffy)
  • @Justin 是的,我应该在我的评论中强调“应该”部分,因为它没有。您的链接是一个更好的解释。谢谢

标签: c# windows multithreading concurrency


【解决方案1】:

由于我手头没有这本书,我只能猜测他在谈论处理器如何执行代码。

没有将数据传输到 CPU 寄存器的余地,因为这是 CPU 指令可以访问它的唯一方式。因此,从这个意义上说,每次线程使用来自共享位置的数据时,都必须制作一个临时私有副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2015-02-14
    相关资源
    最近更新 更多