Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Sử dụng ReaderWriterLock trong C#

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ínhMô tả
IsReaderLockHeldLuồng hiện tại có đang giữ khóa đọc không
IsWriterLockHeldLuồng hiện tại có đang giữ khóa ghi không
WriterSeqNumSố thứ tự trình tự ghi hiện tại

Các phương thức chính

Phương thứcMô 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).