Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自共享位置的数据的私有副本_C#_Windows_Multithreading_Concurrency - Fatal编程技术网

C# 来自共享位置的数据的私有副本

C# 来自共享位置的数据的私有副本,c#,windows,multithreading,concurrency,C#,Windows,Multithreading,Concurrency,我正在阅读Joe Duffy的《Windows上的并发编程》(Concurrent Programming on Windows),并偶然发现了以下声明: 多个线程从共享位置创建数据的私有副本 这个语句是在一个示例之后给出的,Joe展示了从多个线程递增一个全局变量如何导致不可预测的结果,因为它们可能在时间上重叠 然而,我仍然对这句话持怀疑态度,因为没有原子数据类型的私有副本这样的东西——这会使它成为非原子的 因此,当他说从共享位置制作数据的私有副本时,他指的是所有非原子数据类型(用户定义的类型等

我正在阅读Joe Duffy的《Windows上的并发编程》(Concurrent Programming on Windows),并偶然发现了以下声明:

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

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

然而,我仍然对这句话持怀疑态度,因为没有原子数据类型的私有副本这样的东西——这会使它成为非原子的


因此,当他说从共享位置制作数据的私有副本时,他指的是所有非原子数据类型(用户定义的类型等),还是我遗漏了什么?

因为我手头没有这本书,我只能猜测他说的是处理器如何执行代码


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

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