信号量(semaphore)支持 多并发(n>=1)同步锁

本文介绍了信号量(semaphore)的基本概念及其在.NET框架中作为同步锁的应用实例。信号量是一种用于控制多个线程访问共享资源的技术,通过限制同时进入临界区的线程数量来避免竞态条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号量(semaphore)是内核维护的一个Int32的变量。信号量为0时,在信号量上等待的线程会阻塞;信号量大于0时,就解除阻塞。主要方法:

Release():就是一个加1的操作

Release(int32 releasecount):就是一个加releasecount的操作。

初始化semaphore时,可以指定最大和最小信号量的值。

用Sempphore实现同样功能的同步锁,如下为一个只允许1个并发入口(即1次只能有一个线程访问)的示例:

 1  public class Program
 2     {
 3         private class SimpleWaitLock : IDisposable
 4         {
 5             private Semaphore m_semaphore = new Semaphore(1, 1);
 6             
 7             
 8             public void Enter()
 9             {
10                 m_semaphore.WaitOne();
11                 Console.WriteLine("Thread {0} Enter;",Thread.CurrentThread.Name);
12                 Thread.Sleep(100);
13                 Exit();
14             }
15             public void Exit()
16             {
17                 Console.WriteLine("Thread {0} Exit;", Thread.CurrentThread.Name);
18                 m_semaphore.Release();
19                 
20             }
21             public void Dispose()
22             {
23                 m_semaphore.Dispose();
24                 Console.WriteLine("Thread {0} dispose;", Thread.CurrentThread.Name);
25             }
26         }
27         static void Main()
28         {
29             SimpleWaitLock slock = new SimpleWaitLock();
30             for (int i = 0; i < 10; i++)
31             {
32                 Thread thread = new Thread(slock.Enter);
33                 thread.Name = "thread" + i.ToString();
34                 thread.Start();                
35             }
36             Console.Read();
37         }
38      
39 
40     }

结果为:

如将第5行改为(即允许2个并发入口):

private Semaphore m_semaphore = new Semaphore(2, 2);

则结果为:

转载于:https://www.cnblogs.com/Finding2013/archive/2013/04/10/3012548.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值