首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

五天不再惧怕多线程——第四天 信号量

2012-09-10 
5天不再惧怕多线程——第四天 信号量今天整理“信号量”的相关知识,其实想想也蛮有趣的,锁,互斥,信号量都可以

5天不再惧怕多线程——第四天 信号量

今天整理“信号量”的相关知识,其实想想也蛮有趣的,锁,互斥,信号量都可以实现线程同步,在framework里面主要有三种。

<1>:ManualResetEvent

<2>:AutoResetEvent

<3>:?Semaphore

?

好,下面就具体看看这些玩意的使用。

?

一:ManualResetEvent

? ? ? 该对象有两种信号量状态True和False,好奇的我们肯定想知道True和False有什么区别,稍后的例子见分晓,有三个方法值得学习一下。

1:WaitOne

? ? ?该方法用于阻塞线程,默认是无限期的阻塞,有时我们并不想这样,而是采取超时阻塞的方法,如果超时就放弃阻塞,这样也就避免了无限期

? ? ? ?等待的尴尬。

2:Set

? ? ?手动修改信号量为True,也就是恢复线程执行。

3:ReSet

? ? ?手动修改信号量为False,暂停线程执行。

?

好了,下面举个例子说明一下。

?

<1> ?信号量初始为False,WaitOne采用无限期阻塞,可以发现线程间可以进行交互。

?

<2>?信号量初始为True,WaitOne采用无限期阻塞,实验发现WaitOne其实并没有被阻塞。

?

<3>信号量初始为False,WaitOne采用超时2s,虽然主线程要等5s才能进行Set操作,但是WaitOne已经等不及提前执行了。


二:AutoResetEvent

? ? ? 在VS对象浏览器中,我们发现AutoResetEvent和ManualResetEvent都是继承于EventWaitHandle,所以基本功能是一样的,不过值得注意

的一个区别是WaitOne会改变信号量的值,比如说初始信号量为True,如果WaitOne超时信号量将自动变为False,而ManualResetEvent则不会。

?

三:Semaphore?

? ? ?这玩意是.net 4.0新增的,用于控制线程的访问数量,默认的构造函数为initialCount和maximumCount,表示默认设置的信号量个数和

最大信号量个数,其实说到底,里面是采用计数器来来分配信号量,当你WaitOne的时候,信号量自减,当Release的时候,信号量自增,然而

当信号量为0的时候,后续的线程就不能拿到WaitOne了,所以必须等待先前的线程通过Release来释放。

?

好了,下面还是举例子来说明一下:

?

<1> initialCount=1,maximunCount=10,WaitOne采用无限期等待。

我们悲剧的发现t2线程不能执行,我们知道WaitOne相当于自减信号量,然而默认的信号量个数为1,所以t2想执行必须等待t1通过Release来释放。


<2> Semaphore命名,升级进程交互。

? ? ? 在VS对象浏览器中发现Semaphore是继承字WaitHandle,而WaitHandle封装了win32的一些同步机制,所以当我们给Semaphore命名的时候

就会在系统中可见,下面举个例子,把下面的代码copy一份,运行两个程序。

?

是的,我设置了信号量是3个,所以只能有三个线程持有WaitOne,后续的线程只能苦苦的等待。

热点排行