在C#中,加鎖是一種常見的多執行緒程式設計技術,它用於保護共享資源,防止多個執行緒同時對共享資源進行訪問,導致資料錯亂或者異常。會有以下幾種情況需要用到執行緒鎖。
1.多執行緒訪問共享資源
如果多個執行緒需要訪問同一個共享資源(例如全域性變數、靜態變數等),那麼需要在訪問該資源時進行加鎖。否則,多個執行緒可能會同時訪問該資源,導致資料衝突或者異常。
2.執行緒池任務
當使用執行緒池來執行多個任務時,如果其中某個任務需要對共享資源進行訪問,那麼需要確保該資源的訪問是執行緒安全的,可以使用Monitor類或lock語句來進行加鎖。
兩個任務都需要訪問共享資源_data,使用lock語句確保對該資源的訪問是執行緒安全的。
3.系統同步物件
除了使用lock語句外,C#中還提供了一些系統同步物件,例如Mutex、Semaphore、ManualResetEvent、AutoResetEvent等,可以用於實現更加複雜的執行緒同步和互斥。
4.示例
public class C_鎖問題
{
/// <summary>
/// 2.執行緒池任務
/// </summary>
public void Run()
{
ThreadPool.QueueUserWorkItem(x => Foo.DoWork());
ThreadPool.QueueUserWorkItem(x => Foo.DoWork());
}
}
public class SharedData
{
public int Value { get; set; }
}
public class Foo
{
private static SharedData _data = new SharedData();
public static void UpdateValue()
{
lock (_data)
{
// Update the shared data
_data.Value++;
}
}
public static void DoWork()
{
lock (_data)
{
// Update the shared data
_data.Value++;
}
}
}
public class Foo1
{
private static Mutex _mutex = new Mutex();
public static void DoWork()
{
_mutex.WaitOne();
try
{
// 自己的業務程式碼
}
finally
{
_mutex.ReleaseMutex();
}
}
}