1. Dotnet9首页
  2. .NET
  3. .NET相关

C#中的信号量—Semaphore

Semaphore是System.Threading下的类,限制可同时访问某一资源或资源池的线程数。

常用构造方法

https://msdn.microsoft.com/zh-cn/library/e1hct27h(v=vs.110).aspx

public Semaphore(
	int initialCount,
	int maximumCount
)

参数

initialCountType: System.Int32

可以同时授予的信号量的初始请求数。maximumCountType: System.Int32

可以同时授予的信号量的最大请求数。

 示例代码

class Program
    {
       static Semaphore sema = new Semaphore(1,1);
      
        static void Main(string[] args)
        {
            for (int i = 0; i < 3; i++)
            {
                var thread = new Thread(Test) { Name = $"Thread{ i }" };
                thread.Start();
            }
            Console.ReadKey();
        }


        static void Test()
        {
            sema.WaitOne();
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}");
                Thread.Sleep(1000);
            }
            sema.Release();
            Console.ReadKey();
        }
    }

代码说明:

static Semaphore sema = new Semaphore(1,1);

声明一个信号量,指示控制的资源初始和最大线程并发数为1

sema.WaitOne();
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}");
Thread.Sleep(1000);
}
sema.Release();

使用以上两个方法控制资源,某个线程执行sema.WaitOne()方法时,若有其他线程已经占用资源,此方法将阻塞,直到,其他线程释放,即调用sema.Release();方法

执行效果如下:

同一段时间内,只有一个线程进入共享资源中。

C#中的信号量---Semaphore

以下是最大并发数为2的执行效果:

static Semaphore sema = new Semaphore(2,2);

同一段时间内,有两个线程进入了贡献资源中

C#中的信号量---Semaphore

原文出处:博客园【作者:Doublejun】

原文链接:https://www.cnblogs.com/doublejun/p/7520347.html

本文观点不代表Dotnet9立场,转载请联系原作者。


.NET课程推荐
  1. 《.NET Core开发实战》  -  .NET Core微服务架构最佳实践                     点击了解更多
  2. 《.NetCore实战精品集》-  分布式/跨平台/微服务/前后分离/IOC/ORM  点击了解更多

发表评论

登录后才能评论

联系我们

186-2806-45xx

在线咨询:点击这里给我发消息

邮件:632871194@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code