我得到了book about programming in C#.有一個例子。讓我複製並粘貼上下文。比較和交換作爲非原子操作
...介紹了使用聯鎖(這裏省略)。
您還可以使用比較交換方法。該方法首先檢查預期值是否存在;如果是,則用另一個值替換它。
清單1-41顯示比較和交換非原子操作中的值時可能出現的問題。
LISTING 1-41和比較交換作爲非原子操作
class Program
{
static int value = 1;
static void Main(string[] args)
{
Task t1 = Task.Run(() =>
{
if(value==1)
{
// Removing the following line will change the output
Thread.Sleep(1000);
value = 2;
}
});
Task t2 = Task.Run(() =>
{
value = 3;
});
Task.WaitAll(t1, t2); // Displays 2
Console.WriteLine(value);
}
}
任務T1開始運行並看到值等於。與此同時,t2將值更改爲然後t1將其更改回。爲了避免這種情況,你可以使用下面的聯鎖聲明:
Interlocked.CompareExchange(ref value, newValue, compareTo);
這可以確保在比較的價值和交換它的一個新的是一個原子操作。這樣,沒有其他線程可以在比較和交換它之間改變它的值。
這本書不提供更多的細節,只是在這一點結束本節。
我的問題是如何申請Interlocked.CompareExchange(ref value, newValue, compareTo);
的代碼?
我不知道該把它放在哪裏。 –
假設將't1'內的所有代碼替換爲'Interlocked.CompareExchange(ref value,2,1);' –
'Interlocked.CompareExchange(ref value,2,1)''替換't1'。 – Jodrell