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

C#线程同步信号量Semaphore

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Semaphore 信号量, 用来限制可同时访问某一资源或资源池的线程数。

信号量维护了一个计数器, 计数器的值可以在0到指定的最大值之间。

当一个线程完成了对信号量的等待后, 信号量计数器值减少。

当一个线程稀放信号量时, 信号量计数器值增加。

当计数器值达到零后,信号量是"未标志的",当计数器值大于零时, 信号量是"标志的"。

任何线程都无法等待信号量变为"标志的", 因此信号量对限制可以共享数据的线程数量很有用处。

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static Semaphore hSemaphore;
//static Thread[] hThread;
static int source = 0;

static void Main(string[] args)
{
hSemaphore
= new Semaphore(1, 3);

Thread[] hThread
= new Thread[4];
for (int i = 0; i < 4; i++)
{
hThread[i]
= new Thread(new ThreadStart(Proc));
hThread[i].Name
= string.Format("线程{0}", i + 1);
hThread[i].Start();
//Thread t = new Thread(new ParameterizedThreadStart(Proc));
//t.Start(i);
}

//等待半秒直到所有线程都启动并获取信号量
//Thread.Sleep(5000);

for (int i = 0; i < hThread.Length; i++)
{
hThread[i].Join();
}

//释放信号量
//hSemaphore.Release(5);

Console.ReadKey();
}

static void Proc()
{
Console.WriteLine(
"{0} 开始等待信号量, 请求资源", Thread.CurrentThread.Name);
hSemaphore.WaitOne();

Console.WriteLine(
"{0} 已经进入信号量, --使用资源--", Thread.CurrentThread.Name);

source
++;

int p = Interlocked.Add(ref source, 100);
Thread.Sleep(
1000 + p);

Console.WriteLine(
"{0} 已释放信号量, 原信号量数目: {1}", Thread.CurrentThread.Name, hSemaphore.Release());
}

}
}


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
c#图片插入Excel发布时间:2022-07-14
下一篇:
C#CompareTo和String.Compare发布时间: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