【问题标题】:Why use ReaderWriterLockSlim? [duplicate]为什么使用 ReaderWriterLockSlim? [复制]
【发布时间】:2017-12-08 21:37:22
【问题描述】:

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

        }
    }

【问题讨论】:

  • 您将不得不编写一堆坚韧不拔的代码来获得一组与 RWLS 相关的监视器。你不想写它,必须测试它并且永远不能 100% 确定你做对了,这并不快乐。

标签: c# multithreading


【解决方案1】:

它们有不同的语义。 Monitor (lock) 允许一个线程拥有“锁”,就是这样ReaderWriterLock[Slim] 允许任意数量的读者,或者(一个作者,没有其他人)。

因此,如果写入很少且读取花费大量时间,那么读写器设置可能会很有用,这样您就可以有多个并发读取器,但在需要更改数据时将所有人锁定在外面。

两者都不是“更好”。他们做不同的事情。他们每个人都有理想的场景和糟糕的选择。

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 2022-08-15
    • 1970-01-01
    • 2011-06-16
    • 2020-06-01
    • 2011-06-07
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多