【发布时间】: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