SimpleHybirdLock.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading;
  5. namespace TFT_MelsecMcNet
  6. {
  7. /// <summary>
  8. /// 一个简单的混合线程同步锁,采用了基元用户加基元内核同步构造实现
  9. /// </summary>
  10. public sealed class SimpleHybirdLock : IDisposable
  11. {
  12. #region IDisposable Support
  13. private bool disposedValue = false; // 要检测冗余调用
  14. void Dispose(bool disposing)
  15. {
  16. if (!disposedValue)
  17. {
  18. if (disposing)
  19. {
  20. // TODO: 释放托管状态(托管对象)。
  21. }
  22. // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
  23. // TODO: 将大型字段设置为 null。
  24. m_waiterLock.Close();
  25. disposedValue = true;
  26. }
  27. }
  28. // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
  29. // ~SimpleHybirdLock() {
  30. // // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
  31. // Dispose(false);
  32. // }
  33. // 添加此代码以正确实现可处置模式。
  34. /// <summary>
  35. /// 释放资源
  36. /// </summary>
  37. public void Dispose()
  38. {
  39. // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
  40. Dispose(true);
  41. // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
  42. // GC.SuppressFinalize(this);
  43. }
  44. #endregion
  45. /// <summary>
  46. /// 基元用户模式构造同步锁
  47. /// </summary>
  48. private int m_waiters = 0;
  49. /// <summary>
  50. /// 基元内核模式构造同步锁
  51. /// </summary>
  52. private readonly AutoResetEvent m_waiterLock = new AutoResetEvent(false);
  53. /// <summary>
  54. /// 获取锁
  55. /// </summary>
  56. public void Enter()
  57. {
  58. if (Interlocked.Increment(ref m_waiters) == 1) return;//用户锁可以使用的时候,直接返回,第一次调用时发生
  59. //当发生锁竞争时,使用内核同步构造锁
  60. m_waiterLock.WaitOne();
  61. }
  62. /// <summary>
  63. /// 离开锁
  64. /// </summary>
  65. public void Leave()
  66. {
  67. if (Interlocked.Decrement(ref m_waiters) == 0) return;//没有可用的锁的时候
  68. m_waiterLock.Set();
  69. }
  70. /// <summary>
  71. /// 获取当前锁是否在等待当中
  72. /// </summary>
  73. public bool IsWaitting => m_waiters != 0;
  74. }
  75. }