C#ThreadInterlocked 轻量级锁

Posted kkfdsa132

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#ThreadInterlocked 轻量级锁相关的知识,希望对你有一定的参考价值。

        在c#里面,实现线程同步方法有很多种。我了解到的至少有8种。这里先讲下,一种比较简单的同步方法-------轻量级同步Interlock

        为什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步。如果你学过操作系统里面的PV操作(即信号量),那么你对它已经了解了一般。它实现的正是如同信号量的功能。下面是它提供的方法:

       

Interlocked.Increment(ref value)数值加一(原子性操作)
Interlocked.Decrement(ref value)数值减一(原子性操作)
Interlocked.Exchange(ref value1, value2)交换:把值2赋给值1;返回新值
Interlocked.CompareExchange(ref value1, value2, value3)实现比较和交换两种功能:值1和值3比较,如果相同,把值2给值1,不相同则不作任何操作;返回原值(多用于判断条件)(示例3中会用到)

 

      下面是它的几个用法示例:

      (1)示例1:简单输出

 

          

             输出结果如下:

           

 

      (2)示例2:创建1个后台进程和50个前台进程。后台用于每隔一秒通报当期有几个进程在运行。50个前台进程则什么事都不敢,只随机停留1~12秒。代码如下:

        

      结果如下:(答案不唯一,因为线程是随机停留的)

     

 

       (3)示例3:对写文件的加锁操作。我们知道读一个文件可以允许几个人同时进行,而写操作则每次只允许一人。这里创建5个写的进程,每次只能有一个进程可以写,其他进程必须等待当前写进程退出,才可进入。代码如下:

       

         结果如下:

        

 

        (4)示例4:发牌程序。游戏简介:有一个发送线程负责发牌,4个接受线程(可以看做4个玩家)轮流接收牌。这里实现的原理很像信号量的机制。具体说明:

        1、设有一个发送线程sender,依次产生1-52的数,就好像依次发出52张牌。

2、 同时有4个接收线程Receiver在依次接收Sender发出的52张牌

3、 每一轮中,发送线程Sender发送4张牌,4个接收线程轮流接收这四张牌。

4、 设置发送线程的优先级最高为1,保证接收线程每执行一次,即接收一张牌后,再由发送线程执行一次。

          代码如下(在后面的同步线程浅析中,会分别用到其他同步方法(lock,volatile,Monitor等 )实现这个范例,以此作为讲解。):附录该实例下载地址:http://download.csdn.net/source/2230680

         

         结果如下:

       

         

          最后,要提醒一下的是:

          1.在。net2.0以后,微软加强了控件的安全机制,不允许非主线程的线程非委托操控控件,如上面得例子代码提到的。

             当然,有几种方法解决这个问题:

              a.在构造函数里添加一条语句:Control.CheckForIllegalCrossThreadCalls = false;

              b.采用委托机制,示例如下:

            

     

        2.关于控件的访问:

          a.遍历同种类型的控件,如上面代码所示:

           

            如果你的访问的控件,仅是在一个名为panel1的容器里面,你可以修改如下:

             

             b.通过字符串名转为control类型再具体转为该控件类型来访问控件。常用于批处理多个名字前缀相同的控件,例如文本框textbox1,textbox2.。。,方法:this.Controls.Find(string controlName, bool boolValue)。这里列出部分代码:

               

 

         3.在示例3中出现的IDisposable接口,该接口主要用途是实现非托管资源的回收。在对象生命结束时,会自动调用Dispose里面的方法。简单的说,就是显示回收资源。定义一个IDisposable类和调用它方法,请看下面示例:

       

         

        希望对大家有用!在后面,我会继续讲解其他同步线程方法。

以上是关于C#ThreadInterlocked 轻量级锁的主要内容,如果未能解决你的问题,请参考以下文章

IOS自拍党福利解锁轻颜(附哔哩哔哩大会员解析)

调试利器!一款轻量级日志库 log.c

调试利器!一款轻量级日志库 log.c

分享一个简单且轻量级的日志库:log.c

分享一个简单且轻量级的日志库:log.c

C中的轻量级蓝牙LE库