using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace TFT_MelsecMcNet
{
///
/// 一个简单的混合线程同步锁,采用了基元用户加基元内核同步构造实现
///
public sealed class SimpleHybirdLock : IDisposable
{
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
// TODO: 将大型字段设置为 null。
m_waiterLock.Close();
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
// ~SimpleHybirdLock() {
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
// }
// 添加此代码以正确实现可处置模式。
///
/// 释放资源
///
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
// GC.SuppressFinalize(this);
}
#endregion
///
/// 基元用户模式构造同步锁
///
private int m_waiters = 0;
///
/// 基元内核模式构造同步锁
///
private readonly 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();
}
///
/// 获取当前锁是否在等待当中
///
public bool IsWaitting => m_waiters != 0;
}
}