• 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#教程 > C#多线程编程中的锁系统(四):自旋锁

C#多线程编程中的锁系统(四):自旋锁

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

通过本文主要向大家介绍了c#多线程编程实例,c#多线程编程,c#多线程同步,c#多线程实例,c#多线程教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

目录
一:基础

二:自旋锁示例

三:SpinLock

四:继续SpinLock

五:总结

一:基础

内核锁:基于内核对象构造的锁机制,就是通常说的内核构造模式。用户模式构造和内核模式构造

           优点:cpu利用最大化。它发现资源被锁住,请求就排队等候。线程切换到别处干活,直到接受到可用信号,线程再切回来继续处理请求。

           缺点:托管代码->用户模式代码->内核代码损耗、线程上下文切换损耗。

                   在锁的时间比较短时,系统频繁忙于休眠、切换,是个很大的性能损耗。

自旋锁:原子操作+自循环。通常说的用户构造模式。  线程不休眠,一直循环尝试对资源访问,直到可用。

           优点:完美解决内核锁的缺点。

           缺点:长时间一直循环会导致cpu的白白浪费,高并发竞争下、CPU的消耗特别严重。

混合锁:内核锁+自旋锁。 混合锁是先自旋锁一段时间或自旋多少次,再转成内核锁。

           优点:内核锁和自旋锁的折中方案,利用前二者优点,避免出现极端情况(自旋时间过长,内核锁时间过短)。

           缺点: 自旋多少时间、自旋多少次,这些策略很难把控。

           ps:操作系统或net框架,这块算法策略做的已经非常优了,有些API函数也提供了时间及次数可配置项,让开发者根据需求自行判断。

 

二:自旋锁示例

来看下我们自己简单实现的自旋锁:
int signal = 0;
            var li = new List<int>();
            Parallel.For(0, 1000 * 10000, r =>
            {
                while (Interlocked.Exchange(ref signal, 1) != 0)//加自旋锁
                {
                    //黑魔法
                }
                li.Add(r);
                Interlocked.Exchange(ref signal, 0);  //释放锁
            });
            Console.WriteLine(li.Count);
            //输出:10000000
</div>

上面就是自旋锁:Interlocked.Exchange+while

1:定义signal  0可用,1不可用。

2:Parallel模拟并发竞争,原子更改signal状态。 后续线程自旋访问signal,是否可用。

3:A线程使用完后,更改signal为0。 剩余线程竞争访问资源,B线程胜利后,更改signal为1,失败线程继续自旋,直到可用。

三:SpinLock

SpinLock是net4.0后系统帮我们实现的自旋锁,内部做了优化。

简单看下实例:
   var li = new List<int>();
            var sl = new SpinLock();
            Parallel.For(0, 1000 * 10000, r =>
            {
                bool gotLock = false;     //释放成功
                sl.Enter(ref gotLock);    //进入锁
                li.Add(r);
                if (gotLock) sl.Exit();  //释放
            });
            Console.WriteLine(li.Count);
            //输出:10000000
 </div>

四:继续SpinLock

new SpinLock(false)   这个构造函数主要用来帮我们检查死锁用,true是开启。

开启状态下,如果发生死锁会直接抛异常的。

贴了一部分源码(已折叠),我们来看下:
public void Enter(ref bool lockTaken)
        {
            if (lockTaken)
            {
                lockTaken = false;
                throw new System.ArgumentException(Environment.GetResourceString("SpinLock_TryReliableEnter_ArgumentException"));
            }

            // Fast path to acquire the lock if the lock is released
            // If the thread tracking enabled set the new owner to the current thread id
            // Id not, set the anonymous bit lock
            int observedOwner = m_owner;
            int newOwner = 0;
            bool threadTrackingEnabled = (m_owner & LOCK_ID_DISABLE_MASK) == 0;
            if (threadTrackingEnabled)
            {
                if (observedOwner == LOCK_UNOWNED)
                    newOwner = Thread.CurrentThread.ManagedThreadId;
            }
            else if ((observedOwner & LOCK_ANONYMOUS_OWNED) == LOCK_UNOWNED)
            {
              

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

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

  • C#多线程编程详解
  • C#制作多线程处理强化版网络爬虫
  • C#模式画刷HatchBrush用法实例
  • C#纹理画刷TextureBrush用法实例
  • c#实现多线程局域网聊天系统
  • C#选择法排序实例分析
  • C#使用动态规划解决0-1背包问题实例分析
  • C#多线程编程中的锁系统(四):自旋锁
  • C#多线程编程中的锁系统(三)
  • C#多线程编程中的锁系统(二)

相关文章

  • 2017-05-28Winform跨线程操作的简单方法
  • 2017-05-28深入多线程之:Wait与Pulse的使用详解
  • 2017-05-28C#实现给图片加水印的方法
  • 2017-05-28c#通过app.manifest使程序以管理员身份运行
  • 2017-05-28c#获得目标服务器中所有数据库名、表名、列名的实现代码
  • 2017-05-28C#调用mmpeg进行各种视频转换的类实例
  • 2017-05-28详解C#中三个关键字params,Ref,out
  • 2017-05-28WinForm中DefWndProc、WndProc与IMessageFilter的区别
  • 2017-05-28Winform实现鼠标可穿透的窗体镂空效果
  • 2017-05-28C#隐藏手机号、邮箱等敏感信息的实现方法

文章分类

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

最近更新的内容

    • c#实现windows远程桌面连接程序代码
    • C# Memcached缓存用法实例详解
    • c#数据库与TXT导入导出的实例
    • 纯C#实现Hook功能详解
    • C#设置子窗体在主窗体中居中显示解决方案
    • C#中Timer使用及解决重入问题
    • C#利用WebClient实现两种方式下载文件
    • C#读取文件MD5值的实现代码
    • C#调用python文件执行
    • C#通过IComparable实现ListT.sort()排序

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

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