在以下代码中:
a = Interlocked.Exchange(ref b, c);
我知道b原子设置为c。但是在同一原子操作中是否也设置为b?或者这是在原子操作之外。
我需要的是确保a和b都设置在相同的原子操作中。
c => b,b =>一个
这是在C#.Net。
答案 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并将返回值赋给同一个变量,结果可能不正确。但这是一般的线程安全规则 - 只需使用局部变量。