百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT文章 > 正文

第16章 信号量_信号量的值是什么

chenpack 2025-06-26 15:30 27 浏览 0 评论

讲解C#中的信号量和屏障,以及它们在多线程编程中的应用场景

在 C# 中,信号量(Semaphore)屏障(Barrier) 是多线程编程中常用的同步机制,它们用于解决不同的线程协调和同步问题。下面我将详细讲解它们的概念、用法以及实际应用场景。


1. 信号量(Semaphore)

概念

信号量 是一种用于控制 多个线程对共享资源的访问 的同步机制。它维护一个计数器,表示可以访问共享资源的线程数量:

第16章 信号量_信号量的值是什么

  • 当线程请求访问时,信号量的计数器减 1。
  • 当线程释放资源时,信号量的计数器加 1。

信号量有两种类型:

  • Semaphore:允许多个线程访问共享资源(计数信号量)。
  • SemaphoreSlim:轻量级的信号量,适用于大多数情况下的并发编程。

使用 Semaphore 的示例

场景: 有 3 个资源,但 5 个线程要访问这些资源,每次最多只能允许 3 个线程访问资源。

using System;
using System.Threading;

class Program
{
    // 初始化信号量,最多允许 3 个线程访问资源
    static Semaphore semaphore = new Semaphore(3, 3);

    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            Thread thread = new Thread(AccessResource);
            thread.Name = $"Thread {i}";
            thread.Start();
        }
    }

    static void AccessResource()
    {
        Console.WriteLine($"{Thread.CurrentThread.Name} is waiting to enter...");

        // 请求信号量(等待资源)
        semaphore.WaitOne();

        Console.WriteLine($"{Thread.CurrentThread.Name} has entered the critical section.");

        // 模拟线程占用资源的时间
        Thread.Sleep);

        Console.WriteLine($"{Thread.CurrentThread.Name} is leaving the critical section.");

        // 释放信号量
        semaphore.Release();
    }
}

输出示例

Thread 1 is waiting to enter...
Thread 2 is waiting to enter...
Thread 3 is waiting to enter...
Thread 1 has entered the critical section.
Thread 2 has entered the critical section.
Thread 3 has entered the critical section.
Thread 4 is waiting to enter...
Thread 5 is waiting to enter...
Thread 1 is leaving the critical section.
Thread 4 has entered the critical section.
Thread 2 is leaving the critical section.
Thread 5 has entered the critical section.

信号量的应用场景

  • 资源访问控制:限制多个线程对共享资源的同时访问数量。
  • 连接池管理:如数据库连接池或网络连接池的管理。
  • 限流控制:在高并发应用中限制同时执行的任务数量。

2. 屏障(Barrier)

概念

屏障(Barrier) 是一种用于 协调多个线程阶段性执行 的同步机制。所有线程必须在屏障点等待,直到所有线程都到达该点,才能继续执行下一阶段。

核心特点:

  • 线程到达屏障点后会等待。
  • 当所有参与线程都到达屏障点时,屏障解除,所有线程继续执行。
  • 可以设置一个操作,在每次屏障点解除时执行(例如日志记录、进度更新等)。

使用 Barrier 的示例

场景: 4 个线程,每个线程需要分阶段完成任务,所有线程在每个阶段完成后,才能进入下一阶段。

using System;
using System.Threading;

class Program
{
    static Barrier barrier = new Barrier(4, (b) =>
    {
        Console.WriteLine($"All threads reached the barrier. Phase {b.CurrentPhaseNumber} completed.\n");
    });

    static void Main()
    {
        for (int i = 1; i <= 4; i++)
        {
            Thread thread = new Thread(DoWork);
            thread.Name = $"Thread {i}";
            thread.Start();
        }
    }

    static void DoWork()
    {
        for (int phase = 0; phase < 3; phase++) // 模拟三阶段任务
        {
            Console.WriteLine($"{Thread.CurrentThread.Name} is working on Phase {phase}.");
            Thread.Sleep(new Random().Next, )); // 模拟工作时间

            // 到达屏障点并等待其他线程
            barrier.SignalAndWait();

            Console.WriteLine($"{Thread.CurrentThread.Name} passed the barrier for Phase {phase}.");
        }
    }
}

输出示例

Thread 1 is working on Phase 0.
Thread 2 is working on Phase 0.
Thread 3 is working on Phase 0.
Thread 4 is working on Phase 0.
All threads reached the barrier. Phase 0 completed.

Thread 1 passed the barrier for Phase 0.
Thread 2 passed the barrier for Phase 0.
Thread 3 passed the barrier for Phase 0.
Thread 4 passed the barrier for Phase 0.
Thread 1 is working on Phase 1.
Thread 2 is working on Phase 1.
...

屏障的应用场景

  • 多线程分阶段执行任务:需要确保每个阶段的任务都完成后,再进入下一阶段。
  • 并行算法的同步:如分布式计算中,多个节点完成一部分计算后进行结果汇总。
  • 阶段性同步:如多人协作项目,每个阶段的工作完成后再进入下一阶段。

3. 信号量与屏障的区别

特性

信号量(Semaphore)

屏障(Barrier)

作用

控制多个线程对共享资源的并发访问数量

使多个线程在某个阶段同步等待

控制机制

计数器(线程申请资源时计数减 1,释放时加 1)

所有线程必须到达屏障点才能继续执行

线程等待时机

等待资源的可用性

等待所有线程到达屏障点

应用场景

资源访问控制、限流控制

分阶段任务、并行算法同步


4. 总结

  • 信号量(Semaphore) 适用于控制多个线程对共享资源的访问,尤其在 资源池限流控制 的场景下使用。
  • 屏障(Barrier) 适用于需要 阶段性同步 的场景,保证所有线程在完成某一阶段任务后,再同步进入下一阶段。

通过合理选择信号量和屏障,可以有效地解决多线程编程中的线程同步问题,提高程序的执行效率和稳定性。

相关推荐

RouterOS 端口映射 (远程桌面)

一款功能强大的路由器系统-软路由-RouterOS推荐一款路由器系统,头条有很多喜欢使用软路由伙伴可能有很多都不知道RouterOS这个路由系统是,RouterOS是由拉脱维亚MikroTik...

神经网络中的编码器 神经网络视频编码

神经网络算法-一文搞懂Transformer(总体架构&三种注意力层)本文将从Transformer的本质、Transformer的原理、Transformer的应用三个方面,带您一...

必备资料103个WindowsXP运行命令

Windows中CMD最全命令行CMD命令:开始->运行(或者Windows+R)->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)CMD命令锦集1.gpedit...

固态硬盘无法格式化怎么办

Windows中固态硬盘无法格式化怎么办?固态硬盘(简称SSD)是一种数据存储设备,与传统机械硬盘相比,它在许多方面表现得更好。因此,越来越多的用户希望使用固态硬盘,但是当人们购买固态硬盘后准备将其格...

手机信令数据分析_手机信令数据分析过程代码

清华大学公共管理学院刘志林教授:探索手机信令数据在城市治理中的应用中国发展网讯日前,由中国人民大学首都发展与战略研究院(以下简称“首发院”)主办的首都大讲堂(第7期)暨地方治理工作坊第二期在京举办。...

python开发ping工具 ipad python开发工具

python之ping主机#coding=utf-8frompythonpingimportpingforiinrange,):ip=&#;.&#;+str(i)...

云容灾关键技术点简介_云容器技术

阿里云发布企业级云灾备解决方案:一键容灾、成本节省%5月日,阿里云对外发布了企业级云灾备解决方案。据介绍,此次发布的灾备解决方案来自阿里巴巴IT基础设施云化的灾备经验,完全省去灾备机房的建设规划,可大...

域名泛解析设置_域名解析包括泛域名解析

如何降低域名被恶意泛解析的风险买车用车不想被忽悠,就请关注缸微信号:kf12gang←长按可复制。我们每天将免费为您解答选车用车的相关问题。作者:QQ126058域名被恶意泛解析是域名安全最常见的问...

人人通云平台怎么注册 人人通云教学登录账号

世界那么大,她看到了:一个心理咨询师的十年心灵之旅来源:环球网“世界那么大,我想去看看。”十年前的那个春天,十个字的辞职信,戳中了无数国人的心,激起了无数个“诗和远方”的小梦想,被称为“史上最具情怀...

民用远程监控手机软件_民用远程监控手机软件下载

屏幕监控软件有哪些?3款好用的监控软件分享!管控摸鱼小case!作为企业管理者,我深知员工工作效率和信息安全的重要性。在日常管理中,我时常会遇到这样的难题:员工是否在认真工作?有没有利用公司资源做与工...

重量级!Maven史上最全教程,看了必懂

对8个MCP服务器框架的比较作者:FrankGoortani编译:小兰引言模型上下文协议(MCP)是一种新标准,用于以统一方式将AI助手(如LLM)与外部数据源和工具连接起来。自推出以来,各种框架已...

面试字节跳动,收到offer后我却拒绝了 ,给面试人的一些忠告!

面试字节跳动,我被面试官狂怼全过程!来源:https://www.zhihu.com/question//answer/人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的。我一听呀...

ps1手柄 python Ps1手柄真假

别再花冤枉钱!教你一分钟辨别“真假”超皮秒▌什么是超皮秒?皮秒激光,就是每个激光发射的脉冲持续时间(脉宽)达到皮秒级别的激光;1ps等于的负次方秒,超皮秒其实是一种商业名称,本质上也是皮秒激光设备,我...

路由器接交换机UPLINK还是

最全攻略!网络小白也能看懂的交换机连接方法号主:老杨丨年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部中午好,我的网工朋友。在网络设备的世界里,交换机是不可或缺的存在。不同的连接方法...

tempdb 清理 tempdb可以删除吗

无需改代码,提高SQLSERVER数据库性能的个最简单方法众所周知SQLSERVER是微软的数据库拳头产品,有着图形化友好界面、操作门槛低、部署难度小,一键式安装的特点,受到全球开发者及企业的青睐...

取消回复欢迎 发表评论: