前言
使用基元用户构造和基元内核构造创建混合锁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次
线程锁 牢固可靠。