[.net]基元线程同步构造

  1 /* 基元线程同步构造
  2 用户模式构造:
  3     易变构造(Volatile Construct)
  4     互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimistic Concurrency Control,乐观并发控制)
  5 内核模式构造:
  6     事件构造(Event)
  7     信号量构造(Semaphore)
  8     互斥体构造(Mutex)
  9 */
 10 
 11 //易变构造,Volatile.Write()之前的所有字段写入操作,必须再该方法调用之前完成,Volatile.Read()之前的所有字段读取操作,必须再该方法之前完成,保证该方法作用的字段
 12 //的赋值或读取顺序不被编译器优化,C#关键字volatile在语言层面提供了对易变构造的支持,标记为volatile的字段在按引用传递时无效。
 13 public static class Volatile
 14 {
 15     public static void Write(ref Int32 location,Int32 value);
 16     public static Int32 Read(ref Int32 location);
 17 }
 18 
 19 //互锁构造
 20 public static class Interlocked
 21 {
 22     public static Int32 Exchange(ref Int32 location,Int32 value);
 23 
 24     //Int32 old=location; if(location==comparand){ location=comparand;} return old;
 25     public static Int32 CompareExchange(ref Int32 location,Int32 value,Int32 comparand);
 26 }
 27 
 28 //简单自旋锁:自旋会浪费CPU时间,因此自旋锁只适用于执行的非常快的代码区域。在单CPU计算机上,希望获得锁的线程会不断的自旋,如果获得锁的线程优先级比较低的话,
 29 //会导致自旋的线程抢占CPU时间,从而影响拥有锁的线程释放锁,比较容易形成“活锁”。
 30 public struct SimpleSpinlock
 31 {
 32     private Int32 _inUse;//0:false,1:true,Interlocked不支持Boolean
 33     public void Enter()
 34     {
 35         while (true)
 36         {
 37             if(Interlocked.Exchange(ref _inUse,1)==0)
 38                 return;
 39             //一些其他代码
 40         }
 41     }
 42     public void Leave()
 43     {
 44         Volatile.Write(ref _inUse,0);
 45     }
 46 }
 47 public class Demo
 48 {
 49     private SimpleSpinlock _spinLock;
 50     public void Access()
 51     {
 52         _spinLock.Enter();
 53         //取得锁,访问资源
 54         _spinLock.Leave();
 55     }
 56 }
 57 
 58 
 59 //欢乐锁:用于完成一次原子性的操作,如果在执行过程中,数据被外部修改,那么当前执行的过程就无效,然后用修改后的值重新进行这次原子性的操作。
 60 //说直白点就是乐观,与世无争。
 61 public class OptimisticLoack
 62 {
 63     public delegate T Morpher<T, TArgument>(T startValue, TArgument argument);
 64     public static T Morph<T, TArgument>(ref T target, TArgument value, Morpher<T,TArgument> morpher)where T:class
 65     {
 66         T currentValue = target, startValue, desiredValue;
 67         do
 68         {
 69             startValue = currentValue;
 70             desiredValue = morpher(startValue, value);
 71             currentValue = Interlocked.CompareExchange(ref target, desiredValue, startValue);
 72         } while (currentValue != startValue);
 73         return desiredValue;
 74     }
 75 }
 76 
 77 //事件构造:自动重置事件 手动重置事件
 78 public class EventWaitHandle:WaitHandle
 79 {
 80     public Boolean Set();
 81     public Boolean Reset();
 82 }
 83 public class AutoResetEvent():EventWaitHandle
 84 {
 85     public AutoResetEvent(Boolean initialState);
 86 }
 87 public class ManualResetEvent():EventWaitHandle
 88 {
 89     public ManualResetEvent(Boolean initialState);
 90 }
 91 
 92 //信号量构造
 93 public class Semaphore:WaitHandle
 94 {
 95     public Semaphore(Int32 initialCount,Int32 maxinumCount);
 96     public Int32 Release();
 97     public Int32 Release(Int32 releaseCount);
 98 }
 99 
100 //互斥体构造,内部维护一个递归计数,可以实现递归锁
101 public sealed class Mutex:WaitHandle
102 {
103     public Mutex ();
104     public void ReleaseMutex();
105 }
106 
107 //事件构造,信号量构造,互斥体构造均可以简单的实现自旋锁
108 public class SimpleSpinlock
109 {
110     private readonly Mutex m_lock=new Mutex();//针对互斥体构造
111     //private readonly Semaphore m_lock=new Semaphore();//针对信号量构造
112     //private readonly AutoResetEvent m_lock=new AutoResetEvent(true);//针对事件构造
113     public void Enter()
114     {
115         m_lock.WaitOne();
116     }
117     public void Leave()
118     {
119         m_lock.ReleaseMutex();//针对互斥体构造
120         //m_lock.Release(1);//针对信号量构造
121         //m_lock.Set();//针对事件构造
122     }
123 }

 

posted @ 2016-10-04 22:43  DemoApp  阅读(399)  评论(0编辑  收藏  举报