首页 > 编程 > C# > 正文

C#中使用volatile进行线程同步

2023-05-17 11:41:55
字体:
来源:转载
供稿:网友

volatile是最简单的一种同步方法。volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。当然简单是要付出代价的。它只能在变量一级做同步,volatile的含义就是告诉处理器,不要将我放入工作内存,请直接在主存操作我。因此,当多线程同时访问该变量时,都将直接操作主存,从本质上做到了变量共享。

volatile 关键字可应用于以下类型的字段:

(1)引用类型Any  reference type

(2)指针类型(不安全的上下文中)Any pointer type (in an unsafe context)

(3)整型,如sbyte, byte, short, ushort, int, uint, char, float, bool.

(4)具有整数基类型的枚举类型。 An enum type with an enum base type of byte, sbyte, short, ushort, int, or uint.

(5)已知为引用类型的泛型类型参数:IntPtr 和 UIntPtr。

可变关键字仅可应用于类或结构字段。不能将局部变量声明为 volatile。

下面介绍一个具体的例子来说明一下:

   public class A
  {
     private volatile int _i;
     public int I
     {
       get { return _i; }
       set { _i = value; }
     }
  }

但volatile并不能实现真正的同步,因为它的操作级别只停留在变量级别,而不是原子级别。如果是在单处理器系统中,是没有任何问题的,变量在主存中没有机会被其他人修改,因为只有一个处理器,这就叫作processor Self-Consistency。但在多处理器系统中,可能就会有问题。每个处理器都有自己的data cach,而且被更新的数据也不一定会立即写回到主存。所以可能会造成不同步,但这种情况很难发生,因为cach的读写速度相当快,flush的频率也相当高,只有在压力测试的时候才有可能发生,而且几率非常非常小。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表