C# 使用Semaphore(信号量)控制多线程

使用背景

在C#.NET中,当需要动态控制线程的数量时,我们可以使用Semaphore来控制最大线程数。

 

关于Semaphore代码示例

 class Program
 {
         //Semaphore(初始授予0个请求数,设置最大可授予5个请求数)
         static Semaphore semaphore = new Semaphore(0, 5);

         static void Main(string[] args)
         {
             for (int i = 1; i <= 5; i++)
             {
                 Thread thread = new Thread(work);
                 thread.Start(i);
             } 

             Thread.Sleep(1000);
             Console.WriteLine("Main方法结束");

             //授予5个请求
             semaphore.Release(5);
             Console.ReadLine();
         }

         static void work(object obj)
         {
             semaphore.WaitOne();
             Console.WriteLine("print: {0}", obj);
             semaphore.Release();
         }
 }

运行结果如下:

Semaphore

 new Semaphore(0, 5); 构造函数第一个参数,表示我们还可使用的授权数。 第二个参数表示我们最大可申请的授权数。

当授权数用完时,则会造成线程阻塞直到可申请到Semaphore的授权。所以如上代码我一开始初始化了0个授权数,所以没有授权则会被阻塞。

main方法快运行完时,我使用代码semaphore.Release(5);授权了5个请求。 这时还阻塞在semaphore.WaitOne();的代码得到授权则开始继续往下运行,打印出print:{0} 。

 

小提示:semaphore.Release(); 等同于 semaphore.Release(1);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值