zoukankan      html  css  js  c++  java
  • [.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 }
  • 相关阅读:
    python 将函数参数一键转化成字典的技巧,非**kwargs,公有方法和函数抵制kwargs。
    js复制文本内容到剪贴板
    python 记录linux网速到文件。
    使用redis原生list结构作为消息队列取代celery框架。
    supervisor来自动化部署,集成git
    linux windows安装python的最佳方式,miniconda
    celery
    python设计模式之猴子补丁模式
    一个自定义python分布式专用爬虫框架。支持断点爬取和确保消息100%不丢失,哪怕是在爬取进行中随意关停和随意对电脑断电。
    python sort和sorted区别。
  • 原文地址:https://www.cnblogs.com/cjw1115/p/5931443.html
Copyright © 2011-2022 走看看