概述
在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#之线程同步浅析(1)-----轻量级同步Interlocked的全部内容,希望文章能够帮你解决c#之线程同步浅析(1)-----轻量级同步Interlocked所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复