zoukankan      html  css  js  c++  java
  • 内核模式构造-Mutex构造(RecursiveAutoResetEvent)

     1     internal sealed class RecursiveAutoResetEvent : IDisposable
     2     {
     3         private AutoResetEvent m_lock = new AutoResetEvent(true);
     4 
     5         //拥有锁的线程ID
     6         private int m_owningThredId = 0;
     7 
     8         //递归锁计数
     9         private int m_recursiveCount = 0;
    10 
    11         public void Enter()
    12         {
    13             //获取调用线程的唯一Int32 ID
    14             int currentThreadId = Thread.CurrentThread.ManagedThreadId;
    15 
    16             //如果调用线程拥有锁就递增递归计数
    17             if (Equals(m_owningThredId, currentThreadId))
    18             {
    19                 //代码走到这里说明是同一个线程需要获得锁,只需将递归计数加1
    20                 m_recursiveCount++;
    21                 return;
    22             }
    23 
    24             //代码走到这里说明另一个线程需要获得锁
    25             //调用线程未拥有锁就等待
    26             m_lock.WaitOne();
    27 
    28             //调用线程现在拥有了锁,初始化拥有线程的ID和递归计数
    29             m_owningThredId = currentThreadId;
    30             m_recursiveCount = 1;
    31         }
    32 
    33         public void Leave()
    34         {
    35             //如果调用线程不拥有锁就出错
    36             if (!Equals(m_owningThredId, Thread.CurrentThread.ManagedThreadId))
    37             {
    38                 throw new InvalidOperationException();
    39             }
    40 
    41             //从递归计数减1(表示释放一次递归锁)
    42             m_recursiveCount--;
    43             //如果递归计数为0,表明该线程不再拥有锁(递归锁),或者说是递归中的最后一个锁已被释放
    44             if (Equals(m_recursiveCount, 0))
    45             {
    46                 //初始化并且唤醒一个正在等待的线程(如果有)
    47                 m_owningThredId = 0;
    48                 m_lock.Set();
    49             }
    50         }
    51 
    52         public void Dispose()
    53         {
    54             m_lock.Dispose();
    55         }
    56     }
  • 相关阅读:
    POJ3233 构造子矩阵+矩阵快速幂
    HDU4565-数学推导求递推公式+矩阵快速幂
    记录一个状压DP用到的骚操作
    POJ1273 最大流模板
    图论复习...
    2017-7 实训经验贴
    Polya定理应用实例
    直线,椭圆,三角形,折线分割平面问题
    hdu4801 PocketCube 2阶魔方
    1256:献给阿尔吉侬的花束
  • 原文地址:https://www.cnblogs.com/xuejietong/p/8645327.html
Copyright © 2011-2022 走看看