.NET 线程同步的多种实现
我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行
的线程
(Thread)。线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和
其他线程共享一些资源,比如,内存,文件,数据库等。当多个线程同时读写同一份共享资
源的时候,可能会引起冲突。线程同步可以采用多种方式
,下面我们就来了解一下线程同步
的多种实现方法。
1、AutoResetEvent
, T4 o9 y+ z. d2 f+ o
AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的
资源
(MSDN)
6 o& w4 A+ f! h8 e
访问完独占资源后的线程,通过发送信号通知其它等待线程可以开始抢占资源了,最
终已独占的形式访问资源。
AutoResetEvent 初始化时可以设置 new AutoResetEvent (False) 即刚开始无信号,所有
等待线程都在等待信号的发出,如为
True,则刚开始将有一个线程能马上获得信号进入独
占资源直到发出信号。
AutoResetEvent 初始化时如果为 True 则有信号,否则为无信号,当每次 Set()的时候会
自动释放一个等待的线程,与
ManualResetEvent 不同的是: 顾名思义 AutoResetEvent :在
释放一个等待线程后,此同步事件会在发出相应的信号时自动重置事件等待句柄,自动重
置事件通常用来一次为一个线程提供对资源的独占访问。而
ManualResetEvent 则是需要手动
重置事件等待句柄,所以并不能保证对资源的独占访问。
, X( t3 D) ^- t
class Program
A, S, h$ _0 H) X& u
{
private static AutoResetEvent AutoReset =
' b/ b5 M, P& W& e" o
new AutoResetEvent(true);
' X" M. V0 ?- w. |" y; G! _
static void Main(
string[] args)
' {2 Q! L, H7 l6 h! K H* ^
{
) B* i, n; ]7 L& F% e+ \% T5 m n
) R8 Z7 p5 G/ z8 Y
//自动重置
AutoResetEventText();
}