为什么要使用ReaderWriterLockSlim?

时间:2017-12-08 13:31:34

标签: c# multithreading

了解ReaderWriterLockSlim。试着理解为什么ReaderWriterLockSlim优于任何其他锁,例如Monitor

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);
            }

        }
    }

1 个答案:

答案 0 :(得分:0)

他们有不同的语义。 Monitorlock)允许一个帖子拥有&#34;锁定&#34;,以及 ReaderWriterLock[Slim]允许任意数量的读者,或(一位作家和其他人)。

因此,如果写入很少并且读取需要花费很多时间,那么读写器设置可能会很有用,这样您就可以拥有多个并发读取器,并在需要改变数据时将所有人锁定。< / p>

&#34;更好&#34;。他们做不同的事情。他们每个人都有理想的场景,以及他们选择不好的场景。