Interlocked.Exchange的返回值是否也是原子处理的?

时间:2010-10-04 12:51:35

标签: .net locking atomic

在以下代码中:

a = Interlocked.Exchange(ref b, c);

我知道b原子设置为c。但是在同一原子操作中是否也设置为b?或者这是在原子操作之外。

我需要的是确保a和b都设置在相同的原子操作中。

c => b,b =>一个

这是在C#.Net。

2 个答案:

答案 0 :(得分:2)

我假设您正在考虑这样的代码:

using System;
using System.Threading;

class Test
{
    static int x = 1;
    static int y = 2;

    static void Main()
    {
        x = Interlocked.Exchange(ref y, 5);
    }
}

在这种情况下,不,操作不是原子的。在IL中,有两个单独的操作:

  • 调用方法
  • 将值从名义堆栈复制到字段

y存储Interlocked.Exchange的返回值之前,另一个“看到”x的帖子完全有可能变为5。

就个人而言,如果我正在寻找需要自动更改多个字段值的内容,我会考虑使用锁而不是原子锁定操作。

答案 1 :(得分:0)

Interlocked.Exchange方法(Int32,Int32)定义:

将32位有符号整数设置为指定值,并返回原始值作为原子操作。

MSDN文章http://msdn.microsoft.com/en-us/library/d3fxt78a.aspx中的代码示例使用Interlocked.Exchange返回代码进行线程安全资源锁定。所以,答案是肯定的,这是原子操作。

当然,如果在不同的线程中运行Interlocked.Exchange并将返回值赋给同一个变量,结果可能不正确。但这是一般的线程安全规则 - 只需使用局部变量。