5.Semaphore
Semaphore是同一时间允许几个进程同时获取共享资源的,如下例:
static void Main() { for (int i = 0; i < 6; i++) { Console.WriteLine("=========={0}===========",i); Thread t= new Thread(() => { Proc("Thread"+i,i*1000); }); Console.WriteLine("=========={0}===========", i); t.Start(); } Console.Read(); } static Semaphore sem = new Semaphore(2, 2); static void Proc(string name,int secs) { Console.WriteLine("{0} wait to access",name); sem.WaitOne(); Console.WriteLine("{0} get access",name); Thread.Sleep(secs); Console.WriteLine("{0} complete", name); sem.Release(); }
新建立了6个线程,设置最多只有2个线程,每次只有2个线程可以获取资源,等到这个两个线程执行完毕,释放了线程锁,然后余下的线程可以继续获取锁执行;
6.AutoResetEvent && ManualResetEvent
static void Main() { AutoResetEvent ae = new AutoResetEvent(false);//false无信号,当调用的时候是阻塞的 ManualResetEvent me = new ManualResetEvent(false); //AutoResetEvent 执行完之后会自动把把信号量关闭,必须为下面的线程开信号量,下面的线程才可以获取到信号量 //ManualResetEvent 执行完之后不会把信号量关闭,下面的线程可以继续获取工作 new Thread(() => { Console.WriteLine("Thread1 entry"); //ae.WaitOne(); me.WaitOne(); Console.WriteLine("Thread1 exit"); //ae.Set();//释放信号 }).Start(); new Thread(() => { Console.WriteLine("Thread2 entry"); //ae.WaitOne(); me.WaitOne(); Console.WriteLine("Thread2 exit"); }).Start(); //ae.Set();//释放信号 me.Set(); Console.Read(); }