同步对象 Semaphore

 semaphore:  保证指定个数的并发线程可以访问临界区。 而 lock/mutex:保证只有一个线程可以访问临界区(被lock住的)的资源或者代码。

namespace MutiThread
{
    /// <summary>
    /// .net 信号量Semaphore的使用
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //初始化4个线程
            Mythread mythrd1 = new Mythread("Thrd #1");
            Mythread mythrd2 = new Mythread("Thrd #2");
            Mythread mythrd3 = new Mythread("Thrd #3");
            Mythread mythrd4 = new Mythread("Thrd #4");
 
            //Join()方法阻塞调用线程 
            //达到主线程在4个子线程执行完毕才退出的目的
            mythrd1.thrd.Join();
            mythrd2.thrd.Join();
            mythrd3.thrd.Join();
            mythrd4.thrd.Join();
 
        }
    }
 
    /// <summary>
    /// 封装线程类
    /// </summary>
    class Mythread
    {
        public Thread thrd;
        //创建一个可授权2个许可证的信号量,且初始值为2
        static Semaphore sem = new Semaphore(2, 2);
 
        public Mythread(string name)
        {
            thrd = new Thread(this.run);
            thrd.Name = name;
            thrd.Start();
        }
 
        void run()
        {
            Console.WriteLine(thrd.Name + "正在等待一个许可证……");
            //申请一个许可证
            sem.WaitOne();
            Console.WriteLine(thrd.Name + "申请到许可证……");
            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine(thrd.Name + ": " + i);
                Thread.Sleep(1000);
            }
            Console.WriteLine(thrd.Name + " 释放许可证……");
            //释放许可证
            sem.Release();
        }
    }
 
}
  

  

posted on 2015-10-22 14:16  豆沙包没有肉  阅读(115)  评论(0编辑  收藏  举报

导航