background image

1 g% ~3 s, Y" G4 ?! T/ ]. w

  

AutoReset.Set();

# }3 i7 H6 c) ]$ f0 f8 F! W

4 c( `& f. H" M# \$ E) k

  

Console.WriteLine(threadName +

5 o  d: \4 Q' r, j, T3 [

"over ");

& Q; @5 N& I# E

  

}

+ b3 n# i( p# x, |" x

% w. L3 b" b" y" J* C& e

  

}

7 J" F* i) x. I) \

 

我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的
线程

(Thread)。线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和其

他线程共享一些资源,比如,内存,文件,数据库等。当多个线程同时读写同一份共享资源
的时候,可能会引起冲突。线程同步可以采用多种方式

,下面我们就来了解一下线程同步的

多种实现方法。

4 `+ V1 E; u2 \! H. _

  

1、AutoResetEvent

  

AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的

资源

(MSDN)

  访问完独占资源后的线程,通过发送信号通知其它等待线程可以开始抢占资源了,最
终已独占的形式访问资源。
  

AutoResetEvent 初始化时可以设置 new AutoResetEvent (False) 即刚开始无信号,所有

等待线程都在等待信号的发出,如为

True,则刚开始将有一个线程能马上获得信号进入独

占资源直到发出信号。

$ W  i& n; h; s! o3 h% p5 Y$ t

  

AutoResetEvent 初始化时如果为 True 则有信号,否则为无信号,当每次 Set()的时候会

自动释放一个等待的线程,与

ManualResetEvent 不同的是: 顾名思义 AutoResetEvent :在

释放一个等待线程后,此同步事件会在发出相应的信号时自动重置事件等待句柄,自动重
置事件通常用来一次为一个线程提供对资源的独占访问。而

ManualResetEvent 则是需要手动

重置事件等待句柄,所以并不能保证对资源的独占访问。

$ M# D$ S- m7 F. F3 X$ \( H1 M

  

class Program

- B# i8 c6 J2 g

  

{

7 @& r6 M" Q/ h$ m

  

private static AutoResetEvent AutoReset =

new AutoResetEvent(true);

0 A" F1 W* \! j) U6 V, a

: o' l3 L" `4 g1 w+ t! [$ r

  

static void Main(

string[] args)

" W5 a4 B9 a2 F( x; w2 J1 @

  

{

  

//自动重置

  

AutoResetEventText();

  

}

  @: N/ i+ U1 Q" O9 f/ B% D