Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การใช้ ReaderWriterLock ใน C#

ภาพรวม

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