C# 多线程 信号量

一、概述

        信号量的作用类似银行的柜台,具有一定的数量,当柜台都已有顾客在办理事务时,后面的顾客只能排队等待某个柜台办理完结后再进入柜台。

        信号量需要设置最大的允许数量和当前的空位数量。

        容量为1的信号量即与 lock 和 Mutex 功能类似

        .NET提供了两个信号量:

  • Semaphore:继承自线程通信事件WaitHandle。
  • SemaphoreSlim:轻量级信号量

二、代码

        设置信号量最大允许数量为3,开5个线程,只会同时运行3个:

  static SemaphoreSlim _sem = new SemaphoreSlim (3);    // 容量为 3

  static void Main()
  {
    for (int i = 1; i <= 5; i++) new Thread (Enter).Start (i);
  }

  static void Enter (object id)
  {
    Console.WriteLine (id + " wants to enter");
    _sem.Wait();
    Console.WriteLine (id + " is in!");           // 同时只能有
    Thread.Sleep (1000 * (int) id);               // 3个线程
    Console.WriteLine (id + " is leaving");       // 执行这里
    _sem.Release();
  }

        运行的结果如下:

1 wants to enter
1 is in!
2 wants to enter
2 is in!
3 wants to enter
3 is in!
4 wants to enter
5 wants to enter
1 is leaving
4 is in!
2 is leaving
5 is in!

参考链接:

C#中的多线程 - 同步基础 - GKarch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值