c# Semaphore(信号量)

C# 中的Semaphore(信号量)详解与应用 C# 中的 Semaphore(信号量)是一种强大的同步机制,它可以帮助开发者控制对共享资源的访问。通过使用信号量,我们可以有效地管理多个线程对共享资源的访问,确保资源的使用不会导致数据竞争或其他同步问题。Semaphore 在 C# 编程中的重要性体现在它能够帮助开发者实现复杂的并发控制逻辑,同时保持代码的可读性和可维护性。它的易用性体现在简单的 API 设计和丰富的同步上下文支持。在实际应用中,信号量可以用于限制数据库连接池的大小、控制网络资源的访问、实现生产者-消费者模式的同步等。 阅读详情

http://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813635.html

http://hi.baidu.com/bloodcrystal/blog/item/00ebd7f9da5aadd2b58f317c.html

信号量 Semaphore

类似互斥锁,但它可以允许多个线程同时访问一个共享资源

通过使用一个计数器来控制对共享资源的访问,如果计数器大于0,就允许访问,如果等于0,就拒绝访问。计数器累计的是“许可证”的数目,为了访问某个资源。线程必须从信号量获取一个许可证。

通常在使用信号量时,希望访问共享资源的线程将尝试获取一个许可证,如果信号量的计数器大于0,线程将获取一个许可证并将信号量的计数器减1,否则先线程将阻塞,直到获取一个许可证;当线程不再需要共享资源时,将释放锁拥有的许可证,并将许可证的数量加1,如果有其他的线程正在等待许可证,那么该线程将立刻获取许可证。

另外,允许同时访问的资源的进程数量是在创建信号量时指定的,如果创建一个允许进程访问的信号量数目为1,则该信号量就和互斥锁的用法一样。

Public Semaphore(int initialCount,int maximumCount)

initialCount指信号量许可证的初始值,maximumCount为最大值

获取许可证使用WaitOne()

不需要时释放使用 public int Release();或者public int Release(int  releaseCount);

Semaphore与Mutex更像是兄弟,仍然与EventWaitHandle一脉不太亲近:
Semaphore从机制上来说跟Mutex一样属于“锁”而不是“通知”,因此跟Mutex一样几乎没有“通知”的能力。
举个不恰当但是很形象的例子,Semaphore就是一个可以多次进入的“Mutex”。Mutex永远只允许一个线程拥有它,而Semaphore可以允许多个线程请求,因此Semaphore被用于管理一次可以允许多个线程进入并发访问资源的情况。之所以说“不恰当”,是因为一旦允许多个线程访问资源,那么这时候的资源一定不是互斥资源,相应的代码段也不再是“临界区”。你千万不要以为我们在上一篇中提到的“糖罐”里有多颗糖就叫做“资源池”(都说过了嘛一个糖罐一定是需要互斥访问的),除非你有多个糖罐而不是多颗糖。
因为Semaphore与Mutex在请求数量上的不同,因此他们的线程相关性是不同的。这一点,Semaphore到跟EventWaitHandle一样,它是线程无关的。也就是说对Semaphore地释放者可以不定是Semaphore的拥有者。比如说我可以是消费者线程总使用WaitOne()请求线程池中的资源从来不需要释放,而生产者总是Release线程池中的资源而从来不请求。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

namespace MyTTCon
{
    class mythread
    {
        public Thread thrd;
        //创建一个可授权2个许可证的信号量,且初始值为2
        static Semaphore sem = new Semaphore(2, 2);

        public mythread(string name)
        {
            thrd = new Thread(this.run);
            thrd.Name = name;
            thrd.Start();
        }
        void run()
        {
            Console.WriteLine(thrd.Name + "正在等待一个许可证……");
            //申请一个许可证
            sem.WaitOne();
            Console.WriteLine(thrd.Name + "申请到许可证……");
            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine(thrd.Name + ": " + i);
                Thread.Sleep(10000);
            }
            Console.WriteLine(thrd.Name + " 释放许可证……");
            //释放
            sem.Release();
        }
    }

    class mysemaphore
    {
        public static void Main()
        {
            mythread mythrd1 = new mythread("Thrd #1");
            mythread mythrd2 = new mythread("Thrd #2");
            mythread mythrd3 = new mythread("Thrd #3");
            mythread mythrd4 = new mythread("Thrd #4");
            mythrd1.thrd.Join();
            mythrd2.thrd.Join();
            mythrd3.thrd.Join();
            mythrd4.thrd.Join();
        }
    }
}


C# 信号量(Semaphore)详细使用案例 在C#中,信号量(Semaphore)是.NET框架提供的一个同步类,位于命名空间下,用于控制并发访问特定资源的线程数量。它是一种更灵活的线程同步机制,通过维护一个计数器来管理资源的可用性。 阅读详情

相关推荐

C# 信号量semaphore使用

using System; using System.Threading; namespace SemaphoreSample { class Program { private static Semaphore _pool; private static int _padding; static void Main(string[] args) { // 初始值 设为 0 /

zxcvb036的博客 384

C#:多线程--信号量(Semaphore)

百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。 1. Semaphore常用的方法有两个WaitOne()和Release(), Release()的作用是退出信号量并返回前一个计数, 而WaitOne()则是阻止当前线程,直到当前线程的WaitHandle 收到信号。 这里我举一个例子让大家更容易理解:...

SSS_369 6930

C# 信号量(Semaphore)详解与实战

信号量(Semaphore)是C# 中用于线程同步的高级机制之一,通过维护计数器控制线程并发访问数量,适合有限资源访问控制。文章从核心概念、构造函数、关键方法(WaitOne/Release)等方面进行解析,并提供了单线程唤醒、多线程并发控制及跨进程同步的实战示例。通过正确使用信号量,可以有效提升程序的并发性能和稳定性。

qq_34552942的博客 1021

关于c#多线程中的几个信号量

ManualResetEvent 与上面的AutoResetEvent 类似在构造函数中也会传入一个Boolean类型参数,不同的是信号量的释放,AutoResetEvent在信号量释放后会自动设置为无信号状态(未终止状态),ManualResetEvent 需要我们手动调用Reset()方法将其设置为无信号量状态(未终止状态),否则其会一直保持有信号量状态(终止状态)ManualResetEvent 如果不手动重置信号量状态,阻塞线程将不会起作用,会立即执行。号量,传递信号量之后将重新设置为无信号状态。

weixin_46476233的博客 2127

c#.net使用正则表达式验证文本中是否包含手机号码或电话号码?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections; namespace RegularPhoneApp { class Program

码农 3584

基于Active-HDL的HDL设计录入与仿真

作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&amp;wvr=6&amp;is_all=1 GitHub:github.com/saint-000 优快云: https://me.youkuaiyun.com/qq_4053...

一个会写代码的烤鸭 7782

操作系统之信号量(Semaphore)以及再C#中的应用,通过信号量实现资源共享,互斥锁,和线程同步操作。

信号量(Semaphore) 是一种比互斥锁更强大的同步工具,它可以提供更高级的方法来同步并发进程或线程。它本质上是一个类型的整数,。而信号量的原子操作,一般就2个一个是表示test另一个是表示增加,简单点理解就是P内部执行等待和测试操作,V内部代码执行添加操作。可以通过信号量控制线程的并发同步操作,并且也可以通过信号量解决互斥锁的问题。下面将通过简单的例子分别介绍当信号量初始化值为0 OR >1 OR .........

csdn2990的博客 3252

国民技术N32G45X SysTick定时器实战:从1us到100ms的精准延迟实现(附完整代码)

本文详细解析了国民技术N32G45X芯片中SysTick定时器的工作原理,并提供了从1微秒到100毫秒的高精度延迟实现方案。通过对比官方库函数的局限性,文章重点介绍了无中断查询模式、时钟源选择策略以及完整的代码实现,帮助嵌入式开发者精准控制时序,适用于LED控制、软件模拟通信协议等多种实战场景。

weixin_29190573的博客 374

C# 关于Semaphore 信号量的用途以及正确用法

今天说说一个也很好用的互斥锁,主角就是其实Semaphore 是一种用于限制同时访问某一资源或资源池的线程数量的同步机制。它类似于交通信号灯,控制进入某个区域的车辆数量。以下是 Semaphore 的用途和正确用法的详细说明及示例。直接上代码讲讲以前开发过程中的实战。

仰望星空的人 1251

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 808

GitLab教程(四):分支(branch)和合并(merge)

命令进行合并时,Git具备一定的智能自动化处理能力:如果一个分支仅修改了文件A,而另一个分支独立地修改了文件B,Git能够无缝整合这些更改,自动完成合并过程——即最终的代码既包含了对A文件的修改也包含了对B文件的修改。同样地,若两个分支虽然都修改了同一个文件,但涉及的是文件中互不重叠的部分,比如一个改动发生在第一行,另一个则在第二行,Git同样能巧妙地自动合并这些非冲突性修改。获取了远程分支的最新变化,或者当你想要合并本地的一个分支到当前分支时,就会用到这个命令。,默认会尝试合并远程分支到当前分支。

TracyCoder的博客 7885

C#多线程--信号量(Semaphore)

Semaphore,是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。 Semaphore常用的方法有两个WaitOne()和Release(),Release()的作用是退出信号量并返回前一个计数,而WaitOne()则是阻止当前线程,直到当前线程的WaitHandle 收到信号。 举例说明: ...

qq_37185371的博客 520

Windows 11 - 打开操作安全中心提示 “需要使用新应用以打开此 Windowsdefender 链接“ 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开)

Windows 11 - 打开操作安全中心提示 "需要使用新应用以打开此 Windowsdefender 链接" 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开),当您点击任务栏上要关闭安全中心防护设置时,这种情况打不开怎么解决,怎么办,Windows安全中心,病毒和威胁保护,账户保护,防火墙和网络保护,设备安全性。

🏆 前端领域优质创作者 1万+

C#线程同步(5)- 信号量 Semaphore

文章原始出处 http://xxinside.blogbus.com/logs/47617134.html 预备知识:C#线程同步(1)- 临界区&Lock,C#线程同步(2)- 临界区&Monitor,C#线程同步(3)- 互斥量 Mutex,C#线程同步(4

Mark Sun 2530

端到端自动驾驶:特斯拉FSD Beta技术拆解

端到端自动驾驶:特斯拉FSD Beta技术拆解 ,人工智能,计算机视觉,大模型,AI,这篇文章围绕特斯拉FSD Beta的端到端自动驾驶技术展开,先介绍端到端自动驾驶的定义、与传统方案的区别及FSD Beta的特点,再阐述其硬件基础、技术架构,解析关键技术,还涉及训练数据与标注、安全与冗余设计、实际应用场景与挑战以及技术迭代与更新等内容,展现了该技术的多方面情况。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

ESP32 WIFI 智能巡线小车设计与实现(四足 / 四轮通用)

本文设计的 ESP32 WIFI 智能巡线小车,硬件模块化、软件轻量化,兼容四足与四轮两种结构,实现了自动巡线与 WIFI 远程控制双功能。系统成本低、易上手,适合嵌入式初学者学习 WIFI 通信、传感器应用、运动控制等核心知识点,也可在此基础上扩展蓝牙控制、避障、视觉识别等功能。

weixin_42300449的博客 152

C#中的信号量---Semaphore

Semaphore是System.Threading下的类,限制可同时访问某一资源或资源池的线程数。常用构造方法https://msdn.microsoft.com/zh-cn/libra...

zls365365的博客 233

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c#信号量Semaphore

进程间通信的方式有很多,常用的方式有: 1.共享内存(内存映射文件,共享内存DLL)。 2.命名管道和匿名管道。 3.发送消息 首先要建立一个进程间共享的内存地址,创建好共享内存地址后,一个进程向地址中写入数据,另外的进程从地址中读取数据。 本文中进程间的同步采用信号量Semaphore的方式同步思想类似于操作系统中生产者和消费者问题的处理方式。在A进程中创建共享内存,并开启一个线程...

sinat_31608641的博客 804

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

c#之信号量Semaphore

在工作中用到信号量,记录一下。

qq_61441787的博客 175

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C#多线程--信号量(Semaphore)

public class Program { static Semaphore sema = new Semaphore(5, 5); const int cycleNum = 9; static void Main(string[] args) { for(int i = 0; i ...

weixin_30849403的博客 140

并发编程 - 线程同步(九)之信号量Semaphore

信号量Semaphore是C#中用于线程同步的机制,通过计数器控制对共享资源的访问。Semaphore和SemaphoreSlim是两种实现,前者内核级别,支持跨进程;后者用户级别,性能更高。使用需注意配对获取和释放信号量。

IT规划师 1225

C# 多线程之一:信号量Semaphore

Semaphore的理解 通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小 访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该信号量许可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请...

weixin_33896726的博客 220

【C#】【Thread】Semaphore/SemaphoreSlim信号量

System.Threading.Semaphore 类表示一个命名(系统范围)信号量或本地信号量。 它是一个对 Win32 信号量对象的精简包装。 Win32 信号量是计数信号量,可用于控制对资源池的访问。      SemaphoreSlim 类表示一个轻量的快速信号量,可用于在一个预计等待时间会非常短的进程内进行等待。 SemaphoreSlim 会尽可能多地依赖由公共语言运行时 (CLR)...

weixin_33796205的博客 285
上一篇: Microsoft.Practices.EnterpriseLibrary.Data Microsoft.Practices.EnterpriseLibrary.Common 使用
下一篇: VS2008制作安装包
andycode
博客等级 码龄17年 12粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值