ReaderWriterLock (namespace System.Threading) cho phép nhiều luồng đọc đồng thời nhưng chỉ một luồng ghi tại một thời điểm. Hiệu suất tốt hơn Monitor/lock khi đọc nhiều, ghi ít.
Các thuộc tính chính
| Thuộc tính | Mô tả |
|---|---|
IsReaderLockHeld | Luồng hiện tại có đang giữ khóa đọc không |
IsWriterLockHeld | Luồng hiện tại có đang giữ khóa ghi không |
WriterSeqNum | Số thứ tự trình tự ghi hiện tại |
Các phương thức chính
| Phương thức | Mô tả |
|---|---|
AcquireReaderLock(TimeSpan) | Lấy khóa đọc với timeout |
AcquireWriterLock(TimeSpan) | Lấy khóa ghi với timeout |
ReleaseReaderLock() | Giải phóng khóa đọc |
ReleaseWriterLock() | Giải phóng khóa ghi |
UpgradeToWriterLock(TimeSpan) | Nâng cấp khóa đọc thành khóa ghi |
Ví dụ cơ bản
using System;
using System.Threading;
class Program
{
static ReaderWriterLock rwLock = new ReaderWriterLock();
static int sharedData = 0;
static void ReadData(int threadId)
{
rwLock.AcquireReaderLock(TimeSpan.FromSeconds(1));
try
{
Console.WriteLine($"Thread {threadId} đọc: {sharedData}");
}
finally { rwLock.ReleaseReaderLock(); }
}
static void WriteData(int threadId, int value)
{
rwLock.AcquireWriterLock(TimeSpan.FromSeconds(1));
try
{
sharedData = value;
Console.WriteLine($"Thread {threadId} ghi: {value}");
}
finally { rwLock.ReleaseWriterLock(); }
}
static void Main()
{
// Demo đơn giản
WriteData(1, 100);
ReadData(2);
}
}
Lưu ý: .NET 4.0+ khuyến nghị dùng ReaderWriterLockSlim (hiệu năng tốt hơn, API đơn giản hơn).