我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#中 ReaderWriterLock的作用是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#中 ReaderWriterLock的作用是什么

这篇文章将为大家详细讲解有关C#中 ReaderWriterLock的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Performance非常差

UpgradeToWriterLock并不是atomic的从ReaderLock转换到WriterLock,而是等同于"lock.ReleaseReaderLock(); lock.AcquireWriterLock();".这样的semantics有一定的迷惑性,我开始的时候也认为这个operation是 atomic的,等出现bug并debug了很久才发现原来如此。不过经过认真的思考,发现这其实不是。NET designer的错,根本没办法把这个operation设计成atomic的。原因如下:

很多个thread同时acquire到了ReaderLock,

他们都call UpgradeToWriterLock,如果这个operation是atomic的,那么没有哪个thread能upgrade成功。

后来我干脆不用C# ReaderWriterLock了,直接换成了LockFree的方法。在C#中实现LockFree其实是很简单的,因为有了Garbage Collection,

code:

  1. class LockFreeDictionary<Key, Value>{  

  2. private Dictionary<Key, Value> m_dict = new Dictionary<Key, Value>();  

  3.  

  4. public Value Lookup(Key key){  

  5. return m_dict[key];  

  6. }  

  7.  

  8. public void Update(Key key, Value value){  

  9. Dictionary<Key, Value> newDict = null;  

  10. Dictionary<Key, Value> oldDict = null;  

  11. do{  

  12. oldDict = m_dict;  

  13. newnewDict = new Dictionary<Key, Value>(oldDict);  

  14. newDict[key] = value;  

  15. }  

  16. while (Interlocked.CompareExchange<Dictionary<Key, Value>>
    (ref m_dict, newDict, oldDict) != oldDict);  

  17. }  

  18. }  

第16行 ,保持参照原有Dictionary物件,

第17行,建造一个新的字典对象的基础上原有的物件。为oldDict ,这一步是只读的,而且不需要锁,

第18行,执行更新操作后,新建造的对象,

第19行,请尝试更换新的对象到原来的1 。如果返回值Interlocked.CompareExchange操作不等于oldDict ,这意味着在此做,而块executation ,有另一个线程改变m_dict 。在这种情况下,我们需要做更新一次。

换出的对象( oldDict )可以收集到的垃圾收集。

如果我们想用LockFree数据结构C++中,还有另一种技术称为危害指针。这是在IBM的研究论文。

不过不是什么情况都可以使用这种LockFreeDictionary的,,不然你会得到相反的效果(performance很差),这里的scenario是read非常多,write非常少。 不过这种情况也挺常见的。

关于C#中 ReaderWriterLock的作用是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#中 ReaderWriterLock的作用是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#中 ReaderWriterLock的作用是什么

这篇文章将为大家详细讲解有关C#中 ReaderWriterLock的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Performance非常差UpgradeToWriterLoc
2023-06-17

c++中system的作用是什么

C++中的system函数是一个标准库函数,用于执行系统命令。它的作用是在程序中调用操作系统的命令行解释器(如Windows的cmd.exe或Linux的shell),并执行传递给该函数的命令。通过system函数,可以在C++程序中执行各
2023-08-09

C#中oledbparameter的作用是什么

C#中的OleDbParameter是用于向数据库传递参数的对象。它可以用于构建包含参数的SQL语句或存储过程,以确保在与数据库交互过程中的安全性和性能。 OleDbParameter对象可以将参数值传递给数据库,并且可以设置参数的数据类型
2023-08-08

c++中static的作用是什么

在C++中,`static`关键字有以下几种作用:1. 静态变量:在函数内部声明的静态变量在程序运行期间只被初始化一次,并且在函数运行结束后仍然保留其值,下次再调用该函数时将继续使用上次的值。```cppvoid func() {stati
2023-10-12

C#中domainUpDown的作用是什么

在C#中,DomainUpDown控件用于显示一个包含预定义项集合的旋转列表。它允许用户在列表中选择一个项,并且可以通过上下箭头按钮来选择前一个或后一个项。DomainUpDown控件通常用于允许用户在有限的选项集合中进行选择,而不需要额
C#中domainUpDown的作用是什么
2023-10-28

c#中isassignablefrom的作用是什么

IsAssignableFrom 方法是Type类的一个成员方法,用于检查一个类型是否可以赋值给另一个类型。具体来说,它接收一个Type对象作为参数,并返回一个布尔值,表示传入的类型是否可以从该Type对象所表示的类型分配。这个方法通常用
c#中isassignablefrom的作用是什么
2024-03-14

C#中AttributeUsage的作用是什么

AttributeUsage是一个特性类(Attribute Class),它用于指定自定义特性(Custom Attribute)可以应用的目标元素(Target Element)以及如何使用它们。AttributeUsage类的作用有
2023-10-24

C++中resumethread的作用是什么

C++中的`ResumeThread`函数用于恢复一个被暂停的线程的执行。当一个线程被创建后,默认情况下它是处于就绪状态,可以被调度执行。通过调用`SuspendThread`函数,可以将一个线程暂停,使其暂时停止执行。而`ResumeT
C++中resumethread的作用是什么
2023-10-28

c++中setprecision的作用是什么

在C++中,setprecision()函数用于设置浮点数输出的精度。它是由库中的头文件提供的。具体来说,setprecision(n)函数用于设置浮点数的小数位数为n位。这意味着在输出浮点数时,最多显示n位小数。如果小数位数不足n位,则
c++中setprecision的作用是什么
2023-10-28

C#中notifyicondata的作用是什么

NotifyIconData类是C#中用于操作系统通知区域图标(也称为托盘图标)的类。它提供了一组属性和方法,用于设置和管理通知图标的显示、行为和事件。NotifyIconData类的作用包括:设置通知图标的图标、标题、提示文本等属性。
C#中notifyicondata的作用是什么
2024-02-29

c++中async的作用是什么

在C++中,async是一个用来创建异步任务的函数模板。它的作用是创建一个异步任务,并返回一个std::future对象,用来获取异步任务的执行结果。通过async函数,可以在一个单独的线程中执行一段代码,而不会阻塞当前线程的执行。这样可
c++中async的作用是什么
2024-03-06

c#中internal的作用是什么

在C#中,internal关键字用于限制访问级别,表示只能在同一个程序集(assembly)内部访问该成员或类型。换句话说,internal成员可以被同一程序集中的任何类访问,但不能被其他程序集中的类访问。这使得internal成员在模块化
c#中internal的作用是什么
2024-03-02

c#中obsolete的作用是什么

在C#中,[Obsolete] 属性用于标记某个成员(方法、属性、字段等)已过时,即不推荐使用。当代码中调用了被标记为[Obsolete]的成员时,编译器会发出警告或错误信息,提醒开发者使用更合适的替代方法或成员。[Obsolete] 属
c#中obsolete的作用是什么
2024-04-09

c#中zxing的作用是什么

在C#中,ZXing是一个用于生成和解析二维码和条形码的开源库。它使开发人员能够轻松地集成二维码和条形码功能到他们的应用程序中,从而实现各种功能,如扫描商品条形码、生成二维码等。ZXing库提供了丰富的API,能够支持多种条形码和二维码格式
c#中zxing的作用是什么
2024-04-08

c++中lua的作用是什么

在C++中,Lua可以用作一种脚本语言,用于扩展C++程序的功能。Lua的作用包括但不限于:可以用Lua脚本语言编写程序逻辑,而无需重新编译整个C++程序。可以用Lua实现插件系统,允许用户动态加载和卸载插件。可以用Lua实现配置文件,
c++中lua的作用是什么
2024-04-08

c++中cast的作用是什么

在C++中,cast的作用是将一种数据类型转换为另一种数据类型。它可以帮助程序员在需要时显式地转换数据类型,从而确保程序的正确性,并避免可能的类型错误。在C++中,有四种类型的cast,分别是static_cast、dynamic_cas
c++中cast的作用是什么
2024-03-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录