• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 深入多线程之:Reader与Write Locks(读写锁)的使用详解

深入多线程之:Reader与Write Locks(读写锁)的使用详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了locks,locks是什么意思,locks of love,file locks,file locks是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

线程安全的一个很经常的需求是允许并发读,但是不允许并发写,例如对于文件就是这样的。

ReaderWriterLockSlim 在.net framework 3.5的时候就提供了,它是用来代替以前的”fat”版本的”ReaderWriterLock”

这两个类,有两种基本的锁----一个读锁,一个写锁。

写锁是一个完全排他锁。

读锁可以和其他的读锁兼容


因此当一个线程持有写锁的是很,所有的尝试获取读锁和写锁的线程全部阻塞,但是如果没有一个线程持有写锁,那么可以有一系列的线程并发的获取读锁。

ReaderWriterLockSlim 定义了下面几个方法来获取和释放 读写锁。

    Public void EnterReadLock();
    Public void ExitReadLock();
    Public void EnterWriteLock();
    Public void ExitWriteLock();

和Monitor.TryEnter类似,ReaderWriterLockSlim 再对应的”EnterXXX”方法上也提供了相应的”Try”版本。ReaderWriterLock提供了AcquireXXX 和 ReleaseXXX 方法,当超时发生了,ReaderWriterLock 抛出一个ApplicationException,而不是返回false。

        public static void Main()
        {
            ///三个读线程
            new Thread(Read).Start();
            new Thread(Read).Start();
            new Thread(Read).Start();

            //两个写线程
            new Thread(Write).Start("A");
            new Thread(Write).Start("B");
        }

        static void Read()
        {
            while (true)
            {
                _rw.EnterReadLock();//获取读锁
                //模拟读的过程
                foreach (int i in _items)
                    Thread.Sleep(100);
                _rw.ExitReadLock();//释放读锁
            }
        }

        static void Write(object threadID)
        {
            while (true)
            {
                Console.WriteLine(_rw.CurrentReadCount + " concurrent readers");

                int newNumber = GetRandomNum(100);

                _rw.EnterWriteLock(); //获取写锁
                _items.Add(newNumber); //写数据
                _rw.ExitWriteLock();  //释放写锁
                Console.WriteLine("Thread " + threadID + " added " + newNumber);

                Thread.Sleep(100);
            }
        }

        //获取随机数
        static int GetRandomNum(int max) { lock (_rand) return _rand.Next(max); }
</div>
再实际的发布版本中,最好使用try/finally 来确保即使异常抛出了,锁也被正确的释放了。

像CurrentReadCount 属性,ReaderWriterLockSlim 提供了以下属性用来监视锁。

可更新锁:

再一个原子操作里将读锁升级为写锁是很有用的,例如,假设你想要再一个list 里面写一些不存在的项的时候, 你可能会执行下面的一些步骤:

    </div> </div> </div> </div> </div>

    问题是:在第三步和第四步之间,可能有另一个线程修改了列表。

    ReaderWriterLockSlim 通过一个叫做可更新锁( upgradeable lock),来解决这个问题。

    一个可更新锁除了它可以在一个原子操作中变成写锁外很像一个读锁,你可以这样使用它:

      调用EnterUpgradeableReadLock 获取可更新锁。执行一些读操作,例如判断要写的东西在不在List中。调用EnterWriteLock , 这个方法会将可更新锁 升级为 写锁。执行写操作,调用ExitWriteLock 方法,这个方法将写锁转换回可更新锁。继续执行一些读操作,或什么都不做。

      从调用者的角度来看,它很像一个嵌套/递归锁,从功能上讲,在第三步,

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入多线程之:Reader与Write Locks(读写锁)的使用详解

相关文章

  • 2017-05-28C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(下)
  • 2017-05-28oledb连接access数据库示例
  • 2017-05-28C#正则表达式匹配HTML中的图片路径,图片地址代码
  • 2017-05-28C#使用AutoResetEvent实现同步
  • 2017-05-28C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)
  • 2017-05-28C#判断系统是32位还是64位的方法
  • 2017-05-28C#探秘系列(一)——ToDictionary,ToLookup
  • 2017-05-28C#中按指定质量保存图片的实例代码
  • 2017-05-28C#中sleep和wait的区别分析
  • 2017-05-28C#实现通过ffmpeg从flv视频文件中截图的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#中判断一个集合是否是另一个集合的子集的简单方法
    • 使用C#正则表达式获取必应每日图片地址
    • C#实现json格式转换成对象并更换key的方法
    • C#实现用于生成条形码的类
    • C#通过oledb访问access数据库的方法
    • 关于C#基础知识回顾--反射(一)
    • C# 超高面试题收集整理
    • 举例讲解C#编程中对设计模式中的单例模式的运用
    • C#窗体读取EXCEL并存入SQL数据库的方法
    • C#中子类调用父类的实现方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有