zoukankan      html  css  js  c++  java
  • C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁

    参考网址: https://blog.csdn.net/weixin_43989331/article/details/105356008

    C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁
    介绍几种C#中的锁,最常用的是最后的监视锁,其他的也有必要了解一下原理及应用,特别像WaitOne、WaitHandle在我们项目中应用还是挺多的。

    文章目录
    C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁
    用户模式锁
    内核模式锁
    动态计数锁
    监视锁

    锁:解决多线程中的数据共享安全问题。
    用户模式锁
    volatile关键字:取消release对底层的优化,在读写的时候都从内存中读取

    SpinLock 旋转锁:

    SpinLock spinLock = new SpinLock();
    bool lockTaken = false;
    spinLock.Enter(ref lockTaken);
    spinLock.Exit();

    内核模式锁
    分为:事件锁、信号量、互斥锁、读写锁。

    建议:通常不建议随便使用内核模式锁,资源付出相对较大。我们可以使用混合锁代替,以及我们马上讲到的lock关键字。

    事件锁(自动事件锁、手动事件锁):

    自动事件锁:AutoResetEvent

    AutoResetEvent myLock = new AutoResetEvent(true);//true:表示终止状态(初始状态),false表示非终止
    myLock.WaitOne();
    //...
    myLock.Set();

    手动事件锁:ManualResetEvent,和自动事件锁相比,差距在于可以对多个变量进行批量锁

    ManualResetEvent myLock = new ManualResetEvent(false);//true:可以正常通过的。false:拦截状态,禁止通过。

    myLock.WaitOne();//批量拦截
    //...//由于是一批,这里是无序的
    myLock.Set();

    Semaphore 信号量

    基本原理:是通过int数值来控制线程的个数

    Semaphore myLock = new Semaphore(5, 10);//第一个参数表示同时可以允许的线程数,第二个是最大值

    Semaphore myLock = new Semaphore(1, 10);//每次只能一个线程通过

    Semaphore myLock = new Semaphore(1, 10);

    myLock.WaitOne();
    //...
    myLock.Release();

    • Mutex互斥锁

      可用于非全局变量互斥的情况,如同一ID的用户只允许提交一次抽奖请求。

    Mutex mutex = new Mutex();
    
    mutex.WaitOne();
    //...
    mutex.ReleaseMutex();
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)
    Controls 属性与继承 TShape 类的小练习(使用TShape可以解决很多图形问题)
    QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15192304.html
Copyright © 2011-2022 走看看