C#内置提供的原子操作
- Interlocked.Increment:以原子操作的形式递增指定变量的值并存储结果。
- Interlocked.Decrement:以原子操作的形式递减指定变量的值并存储结果。
- Interlocked.Add:以原子操作的形式,添加两个整数并用两者的和替换第一个整数
问题:如果要进行原子的乘法、除法或者其他操作改怎么办,C#并没有内置提供相应的方法呀?
那我们先来大概理解一下原子操作的流程
以增加变量值为例
- 将实例变量添加到CPU寄存器中
- 将该变量的值进行增加
- 将该变量的增加后的值从CPU寄存器中还原到堆或栈中实例变量的值
可以看到如果是多核CPU在多线程环境下可能会导致在执行完步骤1,步骤2后当前线程失去时间片,其他线程读取改变量的值时就会读取到并未增加增加之前的值,所以就导致了数据的不一致。然而C#提供了上面三种原子操作来保证不出现这样的数据不一致,至于底层原理暂时不深究,我们来看看如何实现除这三种方法之外的操作。
进行原子的获取最大值操作
先放代码如下:
public static int Maximum(ref int target, int value)
{
//注意target前面加了 ref ,这样在方法外改变target的值将会影响到方法内的target值,
//即类似按引用传递