Đồng bộ hóa đảm bảo nhiều luồng truy cập tài nguyên chung an toàn. C# cung cấp nhiều cơ chế:
1. lock statement (cơ bản, phổ biến nhất)
public class Demo
{
private readonly object _lock = new object();
public void Process()
{
lock (_lock) // Chỉ 1 luồng vào được tại một thời điểm
{
// Critical section
}
}
}
2. Mutex (đồng bộ hóa giữa các tiến trình)
using System.Threading;
class Program
{
// Mutex có tên - dùng cho inter-process sync
private static Mutex _mutex = new Mutex(false, "Global\\MyAppMutex");
static void Main()
{
Console.WriteLine("Đang chờ Mutex...");
_mutex.WaitOne(); // Block cho đến khi có quyền
Console.WriteLine("Đã có Mutex. Nhấn Enter để giải phóng...");
Console.ReadLine();
_mutex.ReleaseMutex();
}
}
3. Monitor (cấp thấp hơn lock)
Monitor.Enter(_lock);
try { /* critical section */ }
finally { Monitor.Exit(_lock); }
4. Semaphore / SemaphoreSlim (giới hạn số luồng đồng thời)
// Cho phép tối đa 3 luồng cùng lúc
SemaphoreSlim semaphore = new SemaphoreSlim(3);
await semaphore.WaitAsync();
try { /* work */ }
finally { semaphore.Release(); }
So sánh nhanh
| Cơ chế | Phạm vi | Dùng khi |
|---|---|---|
| lock | Trong process | Đơn giản, critical section ngắn |
| Mutex | Cross-process | Đồng bộ giữa nhiều ứng dụng |
| SemaphoreSlim | Trong process | Giới hạn độ song song (throttling) |
| ReaderWriterLockSlim | Trong process | Đọc nhiều, ghi ít |