首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 執行緒安全基礎:使用 Interlocked 類別實現原子操作,避免多執行緒競態條件導致計數錯誤

     編輯:關於C語言

問題場景

多執行緒同時對共享變數 number++ 非原子操作,導致結果小於預期。

對比測試程式碼

int number = 0;

private void Test1() // 非原子
{
    for (int m = 0; m < 10; m++)
    {
        number++;
        Thread.Sleep(100);
    }
    Console.WriteLine(number);
}

private void Test2() // 原子
{
    for (int m = 0; m < 10; m++)
    {
        Interlocked.Increment(ref number);
        Thread.Sleep(100);
    }
    Console.WriteLine(number);
}

private void button1_Click(object sender, EventArgs e)
{
    number = 0;
    for (int i = 0; i < 10; i++) new Thread(Test1).Start();
}

private void button2_Click(object sender, EventArgs e)
{
    number = 0;
    for (int i = 0; i < 10; i++) new Thread(Test2).Start();
}

結果分析

  • Test1:10 執行緒各遞增 10 次,理應 100,實際常 < 100(競態條件)。
  • Test2:Interlocked.Increment 保證原子性,結果穩定為 100。

System.Threading.Interlocked 提供 Increment、Decrement、Exchange、CompareExchange 等原子操作,是無鎖執行緒同步的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved