volatile关键字的用法

时间:2014-03-18 17:26:51

标签: c# volatile

我正在阅读关于volatile关键字的内容,并想知道下面的场景如何锻炼。

Class SomeClass
 {
  volatile int i = 10;
 }

两个线程正在尝试修改变量i。

Thread 1 does i = i + 1;
Thread 2 does i = i - 1;

操作顺序如下:

线程1将变量i读入CPU寄存器。 此时发生线程切换。 线程2读取变量i并将其递减1,因此现在i的值为9; 线程1再次被调度,现在线程1将采用i值格式寄存器(为10)并将其递增为11并将其写回i或将其从原始源读取并将i值读取为9并增加它到10?

由于

2 个答案:

答案 0 :(得分:8)

增量/减量操作不是原子操作,因此您描述的竞争条件完全可能。使用volatile并不能阻止它。您需要使用lockInterlocked.Increment,以确保操作都是原子操作。

答案 1 :(得分:0)

当您写道“线程1再次被调度时,现在线程1将采用i值格式寄存器(为10)并将其递增为11并将其写回i或将其从原始源读取并读取i值为9并将其增加到10?“ - 编辑:在@Servy的帮助下:第一个线程将使用值10,因为之前已读取它以执行下一个添加操作。