gpt4 book ai didi

c# - Interlocked 是否在所有线程中提供可见性?

转载 作者:太空狗 更新时间:2023-10-29 19:57:57 27 4
gpt4 key购买 nike

假设我有一个变量“counter”,并且有几个线程使用Interlocked访问和设置“counter”的值,即:

int value = Interlocked.Increment(ref counter);

int value = Interlocked.Decrement(ref counter);

我可以假设,Interlocked 所做的更改将在所有线程中可见吗?

如果不是,我应该怎么做才能让所有线程都同步变量?

编辑:有人建议我使用 volatile。但是当我将“计数器”设置为 volatile 时,会出现编译器警告“对 volatile 字段的引用不会被视为 volatile ”。

当我阅读联机帮助时,它说,“通常不应使用 ref 或 out 参数传递 volatile 字段”。

最佳答案

x86 CPU 上的 InterlockedIncrement/Decrement(x86 的加锁/减锁)会自动创建内存屏障,这为所有线程提供了可见性(即,所有线程都可以按顺序看到其更新,就像顺序更新一样内存一致性)。内存屏障使所有挂起的内存加载/存储完成。 volatile 与这个问题无关,尽管 C# 和 Java(以及一些 C/C++ 编译器)强制执行 volatile 来创建内存屏障。但是,联锁操作已经有了 CPU 的内存屏障。

也请看看my another answer在计算器中。

请注意,我假设 C# 的 InterlockedIncrement/Decrement 是到 x86 的锁加/减的内部映射。

关于c# - Interlocked 是否在所有线程中提供可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/516863/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com