多线程同步技术(二)

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();
        }

image

新建立了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();
        }
image
原文地址:https://www.cnblogs.com/yeshuimaowei/p/7459177.html