2017-12-08 1 views
0

ReaderWriterLockSlim에 대해 알아보십시오. 왜 ReaderWriterLockSlim을 다른 잠금보다 더 잘 이해하려고하는지, 예를 들어 Monitor과 같습니까?왜 ReaderWriterLockSlim을 사용합니까?

EnterWriteLock()EnterReadLock()의 차이점은 무엇입니까? EnterWriteLock()은 잠길 확률이 EnterReadLock() 이상이라고 생각합니다. 하지만 난 그냥 쓰기가 필요할 때 EnterReadLock()을 사용할 수 있다고 가정합니다. 단지 느릴 것입니다.

class Program 
    { 

     static ReaderWriterLockSlim _rw = new ReaderWriterLockSlim(); 
     static List<int> _items = new List<int>(); 
     static Random _random = new Random(); 

     static void Main(string[] args) 
     { 
      new Thread(read).Start() ; 
      new Thread(read).Start(); 
      new Thread(read).Start(); 

      new Thread(()=>write("A")).Start(); 
      new Thread(() => write("B")).Start(); 


     } 


     public static void read() 
     { 
      while (true) 
      { 
       //_rw.EnterReadLock(); 
       _rw.EnterWriteLock(); 
       for (int i = 0; i < _items.Count; i++) 
       { 
        Thread.Sleep(1000); 
       } 
       //_rw.ExitReadLock(); 
       _rw.ExitWriteLock(); 
      } 
     } 


     public static void write(string value) 
     { 
      while (true) 
      { 
       int newNumber = GetRandom(100); 
       _rw.EnterWriteLock(); 
       _items.Add(newNumber); 
       _rw.ExitWriteLock(); 
       Console.WriteLine("ThreadID={0} added={1}",Thread.CurrentThread.ManagedThreadId,newNumber); 
       Thread.Sleep(100); 
      } 

     } 

     private static int GetRandom(int v) 
     { 
      lock (_random) 
      { 
       return _random.Next(v); 
      } 

     } 
    } 
+0

RWLS와 관련된 일련의 모니터를 얻으려면 많은 코드를 작성해야합니다. 글을 쓰고 싶지는 않습니다. 테스트를 해보는 데는 기쁨이 없으며 100 % 확신하지 못하는 것이 옳습니다. –

답변

0

그들은 다른 의미를 가지고있다. Monitor (lock)은 하나의 스레드가 "잠금"을 소유 할 수있게합니다. 이고 그 스레드는입니다. ReaderWriterLock[Slim]의 독자 수를 임의 수 () 또는 (작성자 한 명과 다른 사람이 아님) 허용합니다.

쓰기가 드물고 읽기 시간이 적기 때문에 읽기/쓰기 설정이 유용 할 수 있으므로 여러 개의 동시 판독기를 사용할 수 있으며 데이터를 변경할 필요가있을 때 모든 사용자를 잠글 수 있습니다.

'더 나은'것도 아닙니다. 그들은 다른 일을합니다. 그들은 각각 이상적인 시나리오와 빈약 한 시나리오를 가지고 있습니다.