HelperTool


前言

使用基元用户构造和基元内核构造创建混合锁SimpleHyBirdLock.


一、SimpleHyBirdLock是什么?

SimpleHyBirdLock 是InterLocked和AutoResetEvent的结合。

二、使用步骤

1.新建类SimpleHyBirdLock

代码如下(示例):

    //简单的混合线程同步锁
    public sealed class SimpleHyBirdLock : IDisposable
    {
        public void Dispose()
        {
            // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            Dispose(true);
            // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
            // GC.SuppressFinalize(this);
        }
        private bool disposedValue = false;//检测冗余调用
        public void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                 //TODO:释放托管状态
                }
                // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                // TODO: 将大型字段设置为 null。
                m_waiterLock.Close();
                disposedValue = true;
            }
             
        }

        //基元用户模式构造
        private int m_waiters = 0;
        //基元内核模式构造
        private AutoResetEvent m_waiterLock = new AutoResetEvent(false);

        public void Enter()
        {
            if (Interlocked.Increment(ref m_waiters) == 1) return;//用户锁可以使用的时候,直接返回,第一次调用时发生
            //当发生锁竞争时,使用内核同步构造锁
            m_waiterLock.WaitOne();
        }

        public void Leave()
        {
                
                if (Interlocked.Decrement(ref m_waiters) == 0) return;//没有可用的锁的时候
                m_waiterLock.Set();
                   
        }

        /// <summary>
        /// 当前锁是否在线程中
        /// </summary>
        public bool IsWaiting => m_waiters != 0;
    }

2.使用SimpleHyBirdLock

代码如下(示例):

  SimpleHyBirdLock myLock = new SimpleHyBirdLock();
 int aaa = 10000;
           Task task1=  Task.Run(()=> {
             
              for (int i = 0; i < 100000; i++)
                {
                  myLock.Enter();
                  aaa =aaa+ 1;
                  myLock.Leave();
                }
            });
            Task task2 = Task.Run(() => {
                for (int i = 0; i < 100000; i++)
                {
                    myLock.Enter();
                    aaa = aaa-1;
                    myLock.Leave();
                }
            });
        
            Task.WaitAll(task1,task2);

            button.Content = aaa.ToString();

循环100000次
线程锁 牢固可靠。
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值