ภาพรวม
ReaderWriterLock ใช้สำหรับซิงโครไนซ์การเข้าถึงทรัพยากรที่มีการอ่านมากกว่าการเขียน มันอนุญาตให้หลายเธรดอ่านพร้อมกันได้ แต่การเขียนต้องมีการเข้าถึงแบบ独占 (exclusive)
การประกาศและคุณสมบัติหลัก
static ReaderWriterLock rwLock = new ReaderWriterLock();
| คุณสมบัติ | คำอธิบาย |
| IsReaderLockHeld | ตรวจสอบว่าเธรดปัจจุบันถือ reader lock อยู่หรือไม่ |
| IsWriterLockHeld | ตรวจสอบว่าเธรดปัจจุบันถือ writer lock อยู่หรือไม่ |
| WriterSeqNum | หมายเลขลำดับของ writer ปัจจุบัน |
เมธอดหลัก
| เมธอด | คำอธิบาย |
| AcquireReaderLock(TimeSpan) | ขอ reader lock พร้อม timeout |
| AcquireWriterLock(TimeSpan) | ขอ writer lock พร้อม timeout |
| ReleaseReaderLock() | ปล่อย reader lock |
| ReleaseWriterLock() | ปล่อย writer lock |
| UpgradeToWriterLock(TimeSpan) | อัปเกรด reader lock เป็น writer lock |
| DowngradeFromWriterLock(ref LockCookie) | ดาวน์เกรด writer lock เป็น reader lock |
ตัวอย่างการใช้งาน
using System;
using System.Threading;
public class SharedResource {
private ReaderWriterLock rwLock = new ReaderWriterLock();
private int data = 0;
public void ReadData() {
rwLock.AcquireReaderLock(TimeSpan.FromSeconds(5));
try {
Console.WriteLine($"Reading: {data}");
}
finally {
rwLock.ReleaseReaderLock();
}
}
public void WriteData(int value) {
rwLock.AcquireWriterLock(TimeSpan.FromSeconds(5));
try {
data = value;
Console.WriteLine($"Writing: {data}");
}
finally {
rwLock.ReleaseWriterLock();
}
}
}
หมายเหตุ
- ใน .NET 2.0+ ควรใช้
ReaderWriterLockSlim แทน ซึ่งมีประสิทธิภาพดีกว่าและ API ใช้งานง่ายกว่า
- ใช้เมื่อมีการอ่านบ่อยและเขียนน้อย (read-heavy workloads)
- ต้องปล่อย lock ในบล็อก finally เสมอเพื่อป้องกัน deadlock