简单混合锁(HybridLock)
1 internal sealed class SimpleHybridLock : IDisposable 2 { 3 //基元用户模式构造使用 4 private int m_waiters = 0; 5 6 //基元内核模式构造 7 private AutoResetEvent m_waiterLock = new AutoResetEvent(false); 8 9 public void Enter() 10 { 11 //指出该线程想要获得锁 12 if (Equals(Interlocked.Increment(ref m_waiters), 1)) 13 { 14 //无竞争,直接返回 15 return; 16 } 17 18 //另一个线程拥有锁(发生竞争),使这个线程等待 19 //线程会阻塞,但不会在CPU上“自旋”,从而节省CPU 20 //这里产生较大的性能影响(用户模式与内核模式之间转换) 21 //待WaitOne返回后,这个线程拿到锁 22 m_waiterLock.WaitOne(); 23 } 24 25 public void Leave() 26 { 27 //该线程准备释放锁 28 if (Equals(Interlocked.Decrement(ref m_waiters), 0)) 29 { 30 //无线程等待,直接返回 31 return; 32 } 33 34 //有线程等待则唤醒其中一个 35 //这里产生较大的性能影响(用户模式与内核模式之间转换) 36 m_waiterLock.Set(); 37 } 38 39 public void Dispose() 40 { 41 m_waiterLock.Dispose(); 42 } 43 }
转载于:https://www.cnblogs.com/xuejietong/p/8640888.html
简单混合锁(HybridLock)相关推荐
- C# lock 语法糖实现原理--《.NET Core 底层入门》之自旋锁,互斥锁,混合锁,读写锁...
在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连 ...
- 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)
一. 监视锁(Monitor和lock) 1. Monitor类,限定线程个数的一把锁(Synchronized lock是他的语法糖),两个核心方法: Enter:锁住某个资源. Exit:退出某一 ...
- 简单鲁班锁拼装技巧_3个简单的技巧来消除背景时,丑陋的边缘
简单鲁班锁拼装技巧 If you cut out a lot of objects from photographs, chances are you've run across a few roug ...
- 详解go中的混合锁 - mutex
0 前言 我们知道,多线程下为了确保数据不会出错,必须加锁后才能访问共享资源.常见的锁包括互斥锁.自旋锁.读写锁等等,往往需要通过系统内核来实现. 然而协程的互斥锁实现原理完全不同,它并不与内核打交道 ...
- Android 实现简单的锁屏功能
写正题之前先闲扯几句.因为前段时间自己的手机电源键不灵,所以手机不能及时锁屏,一度让我很苦恼,后来通过在系统设置找到一个另类的方法,设置让音量键锁屏,最终也解决了问题,但是觉得还是不够爽,作为程序员, ...
- C#线程锁(自旋锁SpinLock、互斥锁Mutex、混合锁Monitor | lock)
一.自旋锁 自旋锁是指当一个线程在获取锁对象的时候,如果锁已经被其它线程获取,那么这个线程将会循环等待,不断的去获取锁,直到获取到了锁.适合于原子操作时间非常短的场景 优点:避免了线程上下文切换.性能 ...
- python简单代码-Python简单进程锁代码实例
先说说线程 在多线程中,为了保证共享资源的正确性,我们常常会用到线程同步技术. 将一些敏感操作变成原子操作,保证同一时刻多个线程中只有一个线程在执行这个原子操作. 我最常用的是互斥锁,也称独占锁.其次 ...
- 什么是锁PHP,PHP简单分布式锁-PHP中的锁
对于PHP的锁,其实并没有什么太多的概念.抛弃一些第三方的依赖,看看有哪些可用的选择. 文件锁 PHP的sync扩展 PHP的opcache中的apc_add 目前可以想到的就这么多,在该项目中我们采 ...
- redis简单分布式锁实现 超简单的那种
1.下载安装启动redis 网上教程很多 不说了 2. 先创建一个简单的Springcloud项目 <?xml version="1.0" encoding="UT ...
最新文章
- ImportError: No module named _ssl解决方法
- 配置arm-linux-gcc 位置
- 不只是相关:基于真理共识论的社区问答可信答案选择新方法
- 通信开源linux,Linux环境进程间通信
- ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2
- 二叉树的前序、中序、后序遍历及互相求法
- SpringMVC+Thymeleaf +HTML的简单框架
- L3-019 代码排版 (30 分)-PAT 团体程序设计天梯赛 GPLT
- 计算机多媒体技术专业论文,多媒体技术论文
- 哲学家进餐问题 C++实现
- idea社区版和企业版区别_idea 社区版开发 springboot及问题
- Calendar根据输入的年份和周数计算该周的开始日期和结束日期
- Qt报错 error: C1083
- 宁盾无线认证对接锐捷EG3220
- hive卡在 kill command不动假死的原因及解决方案
- 云服务器安装图形化界面
- 英语口语275之每日十句口语
- 【渝粤题库】陕西师范大学152205 西方行政学说史 作业(专升本)
- Android可拖动可吸附悬浮窗
- ubuntu下好用的翻译软件