C# ReaderWriterLockSlim类
為了使鎖定機制允許鎖定多個讀取器(而不是一個寫入器)訪問某個資源,可以使用 ReaderWriterLockSlim 類。這個類提供了一個鎖定功能,如果沒有寫入器鎖定資源,就允許多個讀取器訪問資源,但只能有一個寫入器鎖定該資源。
ReaderWriterLockSlim 類有阻塞或不阻塞的方法來獲取讀取鎖,如阻塞的EnterReadLock() 和不阻塞的 TryEnterReadLock() 方法,還可以使用阻塞的EnterWriteLock() 和不阻塞的 TryEnterWriteLock() 方法獲得寫入鎖定。如果任務先讀取資源,之后寫入資源,它就可以使用 EnterUpgradableReadLock() 或 TryEnterUpgradableReadLock() 方法獲得可升級的讀取鎖定。有了這個鎖定,就可以獲得寫入鎖定,而不需要釋放讀取鎖定。
這個類的幾個屬性提供了當前鎖定的相關信息。如CurrentReadCount、WaitingReadCount、WaitingUpgradableReadCount 和 WaitingWriteCount。
下面的示例程序創建了一個包含 6 項的集合和一個 ReaderWriterLockSlim() 對象。ReaderMethod() 方法獲得一個讀取鎖定,讀取列表中的所有項,并把它們寫到控制臺中。WriterMethod(0 方法試圖獲得一個寫入鎖定,以改變集合的所有值。在Main()方法中,啟動6個任務,以調用 ReaderMethod()或WriterMethod()方法。
class Program {private static List<int> _items = new List<int>() { 0,1,2,3,4,5}; private static ReaderWriterLockSlim _rwl =new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);public static void ReaderMethod(object reader) {try{_rwl.EnterReadLock();For (int i = 0; i < _items.Count; i++){Console.WriteLine($"reader {reader}, loop: {i}, item: {_items[i]}"); Task.Delay(40).Wait();}}finally{_rwl.ExitReadLock();}}public static void WriterMethod(object writer) {try{while (!_rwl.TryEnterWriteLock(50)){Console.WriteLine($"Writer {writer} waiting for the write lock"); Console.WriteLine($"current reader count:(_rwl.CurrentReadCount}");}Console.WriteLine($"Writer {writer) acquired the lock");for (int i = 0; i < _items.Count; i++){_items[i]++;Task.Delay(50).Wait();}Console.WriteLine($"Writer {writer} finished");}finally{_rwl.ExitWriteLock();}}static void Main() {var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning,TaskContinuationOptions.None); var tasks = new Task[6];tasks[0] = taskFactory.StartNew(WriterMethod, 1); tasks[1] = taskFactory.StartNew(ReaderMethod, 1);tasks[2] = taskFactory.StartNew(ReaderMethod, 2);tasks[3] = taskFactory.StartNew(WriterMethod, 2);tasks[4] = taskFactory.StartNew(ReaderMethod, 3); tasks[5] = taskFactory.StartNew(ReaderMethod, 4); Task.WaitAll(tasks);}}運行這個應用程序,可以看到第一個寫入器先獲得鎖定。第二個寫入器和所有的讀取器需要等待。接著,讀取器可以同時工作,而第二個寫入器仍在等待資源。?
Writer?1?acquired?the?lock Writer 2 waiting for the write lock current reader count: 0 Writer?2?waiting?for?the?write?lock? current?reader?count:?0 Writer 2 waiting for the write lock current reader count: 0 Writer?2?waiting?for?the?write?lock? current?reader?count:?0? Writer?1?finished reader?4,?loop:?0,item:?1? reader 1, loop: 0, item: 1 Writer?2?waiting?for?the?write?lock? current?reader?count:?4 reader?2,?loop:?0,item:?1? reader 3, loop: 0, item: 1 reader 4,loop: 1, item: 2 reader?1,?loop:?1,?item:?2 reader?3,?loop:?1,item:?2 reader 2, loop: 1, item: 2 Writer 2 waiting for the write lock current?reader?count:?4 reader 4, loop: 2, item: 3 reader?l,?loop:?2,item:?3 reader 2, loop: 2,item: 3 reader 3, loop: 2, item: 3 Writer 2 waiting for the write lock current reader count: 4 reader 4, loop: 3, item: 4 reader?1,?loop:?3,item:?4 reader?2,?loop:?3,?item:?4? reader?3,?loop:?3,?item:?4 reader 4, loop: 4, item: 5 reader 1, loop: 4, item: 5 Writer 2 waiting for the write lock current reader count: 4 reader 2, loop: 4, item: 5 reader 3, loop: 4, item: 5 reader?4,?loop:?5,?item:?6? reader 1,loop: 5,item: 6 reader 2, loop: 5, item: 6 reader 3, loop: 5, item: 6 Writer 2 waiting for the write lock current reader count: 4 Writer 2 acquired the lock Writer?2?finished?微信公眾號?
Dotnet講堂
總結
以上是生活随笔為你收集整理的C# ReaderWriterLockSlim类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xamarin效果第十六篇之GIS添加M
- 下一篇: 【亲身经验】如何在 6 个月内成为“微软