前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#中的信号量---Semaphore

C#中的信号量---Semaphore

作者头像
zls365
发布2020-08-19 14:23:26
8500
发布2020-08-19 14:23:26
举报
文章被收录于专栏:CSharp编程大全

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

常用构造方法

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

代码语言:javascript
复制
public Semaphore(
	int initialCount,
	int maximumCount
)
参数
  • initialCount
  • Type: System.Int32 可以同时授予的信号量的初始请求数。
  • maximumCount
  • Type: System.Int32 可以同时授予的信号量的最大请求数。

示例代码

代码语言:javascript
复制
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();
        }
    }
代码语言:javascript
复制

代码说明:

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

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

代码语言:javascript
复制
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();方法

执行效果如下:

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档