用C#实现互斥操作

news2024/10/21 16:09:22

1、传统的lock

lock简单易用,适合大多数场景,但在高竞争用情况下可能会导致线程阻塞;

        Object obj = new object(); 
        void method1()
        {
            lock (obj)
            {
                // 进行互斥操作
            }
        }

2、SpinLock

SpinLock在低延迟情况下更有效,因为SpinLock会在忙等待(spin)中尝试获取锁;但在高竞用时,可能导致更高的CPU使用率。

SpinLock适合短时间锁定,而lock更通用。选择时需要根据具体的使用场景和性能需求来决定。

        SpinLock spinLock = new SpinLock();
        void method2()
        {
            bool lockTaken = false;
            spinLock.Enter(ref lockTaken);
            try
            {
                // 进行互斥操作
            }
            finally
            {
                if (lockTaken)
                {
                    spinLock.Exit(true);
                }
            }
        }

注意:

SpinLock.Exit方法中,参数决定是否在释放锁时记录锁的状态。一般情况下:

  • Exit(true):用于锁被当前线程正常获取,表示锁状态已被正确管理,适合在正常退出时使用。
  • Exit(false):用于锁可能被异常获取,通常在某些特殊情况下使用,表示不强制解除锁状态。

在大多数普通场景中,使用Exit(true)更为合适,Exit(false)则少用。

3、Mutex

Mutex可以跨进程使用,适合更广泛的场景

Mutex mutex = new Mutex();
mutex.WaitOne(); // 获取锁
try 
{
    // 进行互斥操作
} 
finally 
{
    mutex.ReleaseMutex(); // 释放锁
}

4、SemaphoreSlim

SemaphoreSlim用于限制同一时间访问资源的数量;

SemaphoreSlim semaphore = new SemaphoreSlim(1); // 初始化为1
await semaphore.WaitAsync(); // 获取锁
try 
{
    // 进行互斥操作
} 
finally 
{
    semaphore.Release(); // 释放锁
}

注意:Semaphore和SemaphoreSlim

Semaphore用于限制可访问共享资源的线程数量,SemaphoreSlim是轻量版的Semaphore,但是提供了类似的功能,更适合单进程中的线程同步。

using System;
using System.Threading;

class Program
{
    static SemaphoreSlim semaphore = new SemaphoreSlim(2); // 允许最多两个线程同时访问资源

    static void Main(string[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            int threadNum = i;
            Thread t = new Thread(() => AccessResource(threadNum));
            t.Start();
        }
    }

    static void AccessResource(int threadNum)
    {
        Console.WriteLine($"线程 {threadNum} 尝试访问资源...");
        
        semaphore.Wait(); // 尝试获取信号量,如果已经有两个线程持有信号量,则阻塞
        
        Console.WriteLine($"线程 {threadNum} 获得了资源,正在处理...");
        Thread.Sleep(2000); // 模拟资源处理时间
        
        Console.WriteLine($"线程 {threadNum} 释放了资源...");
        semaphore.Release(); // 释放信号量,允许其他线程继续访问
    }
}

5、ReaderWriterLockSlim

ReaderWriterLockSlim则允许多个线程读取、但在写入时会独占访问;

ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();


rwLock.EnterReadLock(); // 获取读锁
try 
{
    // 进行读操作
} 
finally 
{
    rwLock.ExitReadLock(); // 释放读锁
}



rwLock.EnterWriteLock(); // 获取写锁
try 
{
    // 进行写操作
} 
finally 
{
    rwLock.ExitWriteLock(); // 释放写锁
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FP7127:降压恒流LED芯片 支持双路调色调光 PWM调光

一、降压恒流LED芯片FP7127 FP7127 是平均电流模式控制的 LED 驱动 IC&#xff0c;具有稳定输出恒流的能力&#xff0c;优秀的负载调整率与高精度的电流控制。不用额外增加外部补偿元件&#xff0c;简化 PCB 板设计。输出的LED电流精度为 2%。 如果你想进行PWM数位调光&#…

R语言机器学习教程大纲

文章目录 介绍机器学习算法监督学习Supervised Learning分类Classification回归Regression 无监督学习 Unsupervised Learning聚类 Clustering降纬 Dimensionality Reduction相关Association 强化学习Reinforcement Learning模型自由 Model-Free Methods模型驱动 Model-Based M…

Rancher—多集群Kubernetes管理平台

目录 一、Rancher 简介1.1 Rancher 和 k8s 的区别 二、Rancher 安装及配置2.1 安装 rancher2.2 登录 Rancher 平台2.3 Rancher 管理已存在的 k8s 集群2.4 创建名称空间 namespace2.5 创建 Deployment 资源2.6 创建 service2.7 Rancher 部署监控系统 一、Rancher 简介 Rancher …

curl支持ssl错误:curl: (60) SSL certificate problem: certificate is not yet valid

在测试curl命令的时候发现curl: (60) SSL certificate problem: certificate is not yet valid出现这个错误&#xff0c;已经设置了ssl证书路径&#xff0c;最终发现是板子上时间不对&#xff0c;设置时间后可以正常使用。

论文研读 | End-to-End Object Detection with Transformers

DETR&#xff1a;端到端目标检测的创新 —— 作者 Nicolas Carion 等人 一、背景与挑战 目标检测是计算机视觉领域的一个核心任务&#xff0c;要求模型精确识别图像中的物体类别和位置。传统方法如 Faster R-CNN&#xff0c;因其区域建议网络等复杂结构&#xff0c;使得模型调…

网络安全基础知识点_网络安全知识基础知识篇

文章目录 一、网络安全概述1.1 定义1.2 信息安全特性1.3 网络安全的威胁1.4 网络安全的特征 二、入侵方式2.1 黑客2.1.1 入侵方法2.1.2 系统的威胁2.2 IP欺骗与防范2.2.1 TCP等IP欺骗基础知识2.2.2 IP欺骗可行的原因2.2.3 IP欺骗过程2.2.4 IP欺骗原理2.2.5 IP欺骗防范2.3 Sniff…

数据结构编程实践20讲(Python版)—16有向图

本文目录 16 有向图(Directed Graph)S1 说明特征应用领域S2 示例S3 问题:利用有向图构建贝叶斯网络Python代码代码说明结果S4 问题:有依赖的任务调度Python代码代码说明结果S5 问题:基于有向图的搜索引擎排序算法Python代码代码说明结果往期链接 01 数组02 链表03 栈04 队…

成都睿明智科技有限公司电商服务可靠不?

在这个短视频风起云涌的时代&#xff0c;抖音不仅成为了人们娱乐消遣的首选平台&#xff0c;更是众多商家竞相追逐的电商新蓝海。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以其独到的洞察力和专业的服务&#xff0c;助力无数品牌在这片沃…

使用redis存储股股票数据及近一个月的行情数据

使用redis存储股票数据及近一个月的行情数据 性能瓶颈redis的使用odoo连接redis股票数据的读写结论 性能瓶颈 股票行情对数据的实时性是有要求的&#xff0c;在数据同步时如果都从数据库中查询数据&#xff0c;对于股票行情数据来说是有些慢了&#xff0c;因此我们使用redis来…

视频网站开发:Spring Boot框架的高效实现

5 系统实现 5.1用户信息管理 管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享&#xff0c;可以添加&#xff0c;修改&#xff0c;删除视频分…

HCIP-HarmonyOS Application Developer 习题(十五)

&#xff08;判断&#xff09;1、在HarmonyOs中发布带权限公共事件&#xff0c;发布者首先要在config.json中申请所需的权限。 答案&#xff1a;正确 分析&#xff1a;发布携带权限的公共事件&#xff1a;构造CommonEventPublishInfo对象&#xff0c;设置订阅者的权限。 &#…

基于springboot vue的音乐播放系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

【Postman】如何导出导入数据文件?Postman链接分享?

方式一&#xff1a;postman分享链接 1.1 导出 1.2 导入 1.3 导入完成后删除分享的链接 方式二&#xff1a;postman导出导入json 2.1 导出 2.2 post导入json数据

智慧监管:EasyCVR视频汇聚智能分析平台助力有限空间作业实现全天候可视化监控

随着工业化和城市化进程的加快&#xff0c;有限空间作业&#xff08;如地下管道、储罐、隧道等&#xff09;在各类企事业单位中日益频繁。然而&#xff0c;这类作业环境复杂、危险系数高&#xff0c;对作业人员的安全管理和实时监控提出了严峻挑战。为了保障有限空间作业的安全…

基于Java的茶叶商城设计与实现(源码+定制+开发)茶叶电商系统开发、茶叶电商平台开发、茶叶在线销售平台设计与开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

cocos Creator + fairyGUI 快速入门

版本 Creator 3.8.x&#xff0c;FairyGUI 2022 大部分内容来自 https://en.fairygui.com/docs/sdk/creator 1.新建cocos项目&#xff0c;根目录运行 npm install --save fairygui-cc 引入 fairyGUI库 2.assets目录之外新建fairyGUI项目 3.fairyGUI中编辑UI 完成后发布到Creato…

细数RAG的12个痛点,英伟达高级架构师亲授解决方案

检索增强式生成&#xff08;RAG&#xff09;是一种使用检索提升语言模型的技术。具体来说&#xff0c;就是在语言模型生成答案之前&#xff0c;先从广泛的文档数据库中检索相关信息&#xff0c;然后利用这些信息来引导生成过程。这种技术能极大提升内容的准确性和相关性&#x…

野外便携定位终端|北斗三代短报文通信终端|移动通信终端

QM200B北斗三号便携终端是一款面对野外环境的北斗三代便携设备&#xff0c;具有低功耗、体积小、重量轻等特点。该设备不仅集成了北斗三代区域短电文通信、北斗三代定位功能、移动通信功能&#xff0c;同时具有语音对讲功能&#xff0c;配有液晶屏和功能按键&#xff0c;可在海…

一文彻底弄清Redis的布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的数据结构&#xff0c;用于快速判断一个元素是否在集合中。它能够节省大量内存&#xff0c;但它有一个特点&#xff1a;可能存在误判&#xff0c;即可能会认为某个元素存在于集合中&#xff0c;但实际上不存…

说了很久的建筑转大模型,也不过是想在职场完成赎身

问&#xff1a;为什么从规划转行到大模型&#xff1f; 1、房子卖不掉了&#xff0c;城镇化进入存量时代&#xff0c;发展的蛋糕有限&#xff0c;规划行业式微&#xff1b;而且生态规划更多是保护性规划&#xff0c;不是发展性规划&#xff0c;地方政府的驱动力不足。 2、智能…