• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#多线程之信号量Semaphore

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  • 摘要:访 问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该信号量许 可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请许可证的线程将会得到竞争得到被释放的许可证。

Semaphore的理解

通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小

访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该 信号量许可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请许可证的线程将会得到竞争得到被释放的许可 证。

常见的操作方法 WaitOne():申请一个许可证  Release():释放占用的许可证

具体使用看下面的示例代码:

 using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     using System.Threading;
       
     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();
             }
         }
       
     }
   

 

程序执行结果为:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#文件读写常用类介绍发布时间:2022-07-14
下一篇:
C#图解教程 第十三章 委托发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap