Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Semaphore 信号量

Semaphore 信号量

作者头像
leon公众号精选
发布于 2022-04-27 08:09:03
发布于 2022-04-27 08:09:03
51500
代码可运行
举报
运行总次数:0
代码可运行

Semaphore

c#信号量Semaphore只允许有限数量的线程进入临界区。信号量主要用于资源有限,我们必须限制使用线程的数量的场景。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Semaphore semaphoreObject = new Semaphore(initialCount: 0, maximumCount: 5);

信号量的工作原理

信号量是存储在操作系统资源中的Int32变量。当使用int类型参数进行初始化信号量对象时,这个参数的数字值限制了可以进入临界区的线程数。 当线程进入临界区时,它将Int32变量的值减小为1,当线程从临界区退出时,它将Int32变量的值增加为1。 当Int32变量为0时,没有线程可以进入临界区。 下面是c#信号量初始化的语法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  Semaphore semaphoreObject = new Semaphore(initialCount: 0, maximumCount:

我们用两个参数初始化Semaphore :

  • 初始计数InitialCount
  • 最大计数MaximumCount

最大计数定义了可以进入临界区的最大线程数。初始计数设置 Int32 变量值。例如,如果我们设置最大计数为 3,初始计数为 0。这意味着 3 个线程已经在临界区。如果我们将最大计数设置为 3,初始计数设置为 3,则意味着最多可以有 3 个线程进入临界区,并且临界区中当前没有线程.

在多个进程之间使用信号量

或者 semaphore 有另一个构造函数,它接受额外的字符串作为参数。该字符串参数是一个唯一的字符串,用于在多个进程之间使用信号量

以下是创建信号量的用法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Semaphore semaphoreObject = new Semaphore(initialCount: 0, maximumCount: 5, name: "MyUniqueNameApp");

WaitOne 方法

线程可以通过 WaitOne 方法进入临界区。他们在信号量对象上调用了 WaitOne 方法。如果信号量维护的 Int32 变量大于 0,则允许调用线程进入。

以下是调用WaitOne 的方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
semaphoreObject.WaitOne();

在信号量 WaitOne 方法的另一个重载中,我们可以通过时间间隔,线程可以等待从信号量获取信号。如果线程在指定的时间内没有收到信号,则返回 false 值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool isSignalled = semaphoreObject.WaitOne(TimeSpan.FromSeconds(4));

在上面的例子中,如果调用线程在指定的 4 秒内没有收到信号,则返回 false。如果它接收到信号,则返回真。

Release 方法

当一个线程从临界区退出时,它必须调用 Release 方法来增加信号量对象维护的计数器。进而允许等待线程进入临界区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
semaphoreObject.Release();

默认情况下,Release 方法只将计数器加 1。这意味着只有一个线程从临界区退出。我们还可以向 Release 方法传递一个参数来定义实际退出的线程数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
semaphoreObject.Release(3);

在上面的代码中,我们将 3 传递给 Release 方法。这将通知信号量对象实际上有 3 个线程从临界区退出。所以信号量对象将计数器增加 3。

Semaphore 示例

在下面的示例中显示了如何将信号量对象与Console一起使用。要求限制可以同时使用 Printer 对象的线程数。为此,我们使用最大计数为 3 的信号量对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program
{
    static void Main(string[] args)
    {
        Semaphore semaphoreObject = new Semaphore(initialCount: 3, maximumCount: 3, name: "PrinterApp");
        Printer printerObject = new Printer();
 
        for (int i = 0; i < 20; ++i)
        {
            int j = i;
            Task.Factory.StartNew(() =>
                {
                    semaphoreObject.WaitOne();
                    printerObject.Print(j);
                    semaphoreObject.Release();
                });
        }
        Console.ReadLine();
    }
}
 
class Printer
{
    public void Print(int documentToPrint)
    {
        Console.WriteLine("Printing document: " + documentToPrint);
        Thread.Sleep(TimeSpan.FromSeconds(5));
    }
}

初始化信号量对象,并设置了初始化数和最大数,并给出唯一名称“PrinterApp”。以从 0 到 20 的运行开始 for 循环。使用 TaskFactory 启动线程

每个线程在使用Printer 对象之前都会调用semaphore 对象的WaitOne() 方法。这将限制使用Printer对象的线程数。使用Printer对象后,每个线程调用 Release() 方法来增加信号量的计数器以使更多线程可进入临界区

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

本文分享自 架构师高级俱乐部 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#多线程(5):资源池限制
Semaphore 使用纯粹的内核时间(kernel-time)方式(等待时间很短),并且支持在不同的进程间同步线程(像Mutex)。
痴者工良
2021/04/26
1.2K0
C#中的信号量---Semaphore
Semaphore是System.Threading下的类,限制可同时访问某一资源或资源池的线程数。
zls365
2020/08/19
9250
C#中的信号量---Semaphore
信号量与管程以及原子性,pv原语操作,临界资源和临界区,同步和互斥,信号量,管程与临界区不同,信号量和互斥锁的区别,互斥量(Mutex)
程序的原子性指:整个程序中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
zhangjiqun
2024/12/16
3740
信号量与管程以及原子性,pv原语操作,临界资源和临界区,同步和互斥,信号量,管程与临界区不同,信号量和互斥锁的区别,互斥量(Mutex)
刚拿到阿里offer,还热乎的信号量模型semaphore面经
信号量模型可简单概括为:一个计数器,一个等待队列,三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问它们,这三个方法分别是:init()、down()和up()。你可以结合下图来形象化地理解。
JavaEdge
2021/04/25
6440
刚拿到阿里offer,还热乎的信号量模型semaphore面经
读写屏障如何去理解与使用
读写屏障是用来保证多线程访问共享资源时的线程安全性的机制。读写屏障可以确保对于同一个共享资源,同时只能有一个线程进行写操作,而多个线程可以同时进行读操作。
keyle
2024/11/01
1840
读写屏障如何去理解与使用
并发编程-信号量的使用方法和其实现原理
信号量是并发编程中常见的一种同步机制,在需要控制访问资源的线程数量时就会用到信号量,关于什么是信号量这个问题,我引用一下维基百科对信号量的解释,大家就明白了。
KevinYan
2020/12/31
1.7K0
Go官方设计了一个信号量库
要想知道一个东西是什么,我都爱去百度百科上搜一搜,输入"信号量",这答案不就来了。
haohongfan
2021/09/15
9980
C#Semaphore&SemaphoreSlim
Semaphore 是一个.NET的线程同步对象,可以用来控制对资源的并行访问数量。Semaphore 在计算机科学中是一个很重要的概念,用于解决多线程编程中的各种问题。
JusterZhu
2023/11/03
4210
C#Semaphore&SemaphoreSlim
Semaphore:实现一个限流器
Semaphore 现在普遍翻译成 "信号量",从概念上讲信号量维护着一组 "凭证",获取到凭证的线程才能访问资源,使用完成后释放, 我们可以使用信号量来限制访问特定资源的并发线程数。
码哥字节
2020/03/24
1K0
并发编程系列-Semaphore
Semaphore,如今通常被翻译为"信号量",过去也曾被翻译为"信号灯",因为类似于现实生活中的红绿灯,车辆是否能通行取决于是否是绿灯。同样,在编程世界中,线程是否能执行取决于信号量是否允许。
架构狂人
2023/08/16
2000
并发编程系列-Semaphore
临界区 互斥量 事件 信号量_互斥信号量与同步信号量
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
全栈程序员站长
2022/09/23
9440
Semaphore:如何快速实现一个限流器?
阅读过《Java 并发编程》相关书籍或者阅读过相关源码的朋友应该知道Semaphore,现在普遍翻译为“信号量”,以前也曾被翻译成“信号灯”,因为类似现实生活里的红绿灯,车辆能不能通行,要看是不是绿灯。同样,在编程世界里,线程能不能执行,也要看信号量是不是允许。
码农架构
2020/10/26
6070
Semaphore:如何快速实现一个限流器?
控制并发线程数的Semaphore信号量(Semaphore)语法应用场景其他方法
信号量(Semaphore) 一个同步对象,用于保持在0至指定最大值之间的一个计数值。 当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一 当线程完成一次对semaphore对象的释放(release)时,计数值加一 当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。 semaphore对象的计数值大于0,为signaled状态 计数值等于0,为nonsignaled状态 semaphore对象适用于控制一个仅支持有限个
JavaEdge
2018/05/16
1.9K0
线程同步(互斥锁与信号量的作用与区别)以及临界区临街资源
临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。
zhangjiqun
2024/12/16
3820
线程同步(互斥锁与信号量的作用与区别)以及临界区临街资源
C#多线程--信号量(Semaphore)
emaphore:可理解为允许线程执行信号的池子,池子中放入多少个信号就允许多少线程同时执行。
zls365
2020/08/19
2.1K0
C#多线程--信号量(Semaphore)
临界区、互斥量、信号量
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/53769365
大黄大黄大黄
2018/09/14
2.8K0
信号量及其应用
上述代码中的若把s为当前可用资源的数量,P操作表示获取一个资源,V操作表示释放一个资源。使用资源前先进行P操作,使用完后进行V操作。
你的益达
2020/08/05
7280
[操作系统] 进程间通信:system V 信号量
共享内存和消息队列在通信的时候都有一个前提,就是看到同一份资源。所以看到同一份资源为通信提供了前提条件,但是看到同一份资源进行通信仍然存在问题,例如“没有保护机制”,这样会使得和我们想象逻辑接收到的数据不一致!这个由多个执行流(进程)能看到的同一份公共资源就叫做共享资源。
DevKevin
2025/05/30
950
[操作系统] 进程间通信:system V 信号量
一文讲清Java中的信号量semaphore到底干嘛的
信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态.
JavaEdge
2021/02/22
1.1K0
C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
在多线程编程中,保障共享资源的安全访问依赖于有效的线程同步机制。理解并处理好以下两个核心概念至关重要:
AI.NET 极客圈
2025/06/12
2990
C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
推荐阅读
相关推荐
C#多线程(5):资源池限制
更多 >
交个朋友
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入北京开发者交友群
结识首都开发者 拓展技术人脉
加入前端工作实战群
前端工程化实践 组件库开发经验分享
换一批
加入讨论
的问答专区 >
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验