当前位置: 首页 > news >正文

聊透多线程编程-线程池-8.C# 线程互斥实现方式

目录

1. 锁机制 (Locking Mechanisms)

(1) lock 关键字

(2) Monitor 类

2. 跨进程互斥机制

3. 信号量机制

(1) Semaphore 和 SemaphoreSlim

4. 读写锁机制

(1) ReaderWriterLockSlim

5. 原子操作机制

(1) Interlocked 类

6. 自旋锁机制

(1) SpinLock


 

线程互斥是一种保证在同一时刻只有一个线程能够访问共享资源的机制。它是一种排他性的访问控制,目的是防止多个线程同时对共享资源进行读写操作而导致的数据不一致或其他错误。比如多个线程同时对一个银行账户进行取款操作,如果不进行互斥控制,就可能出现账户余额错误的情况。

在 .NET 中,线程互斥(Mutual Exclusion)有多种实现方式,以下是 .NET 中常见的线程互斥实现方式:

实现方式

特点

使用场景

lock关键字

简单易用,自动管理锁

进程内同步

Monitor类

更细粒度控制锁

显式控制锁的场景

Mutex类

支持跨进程

多进程间同步

信号量Semaphore 

限制最大并发数

控制资源访问数量

读写锁

ReaderWriterLockSlim

允许多线程同时读,但只允许一个线程写

读多写少的场景

Interlocked类

原子操作,高效

简单数值操作

自旋锁SpinLock

自旋等待锁,避免上下文切换

短时间临界区

根据具体需求选择合适的线程互斥机制,能够有效提升程序的性能和可靠性。

 


 

1. 锁机制 (Locking Mechanisms)

(1) lock 关键字

  • 原理: lock 是 C# 中的一个语法糖,它实际上是调用了 Monitor.Enter 和 Monitor.Exit 方法来实现的。当一个线程执行到 lock 语句块时,它会尝试获取锁对象上的排他锁。如果成功获取,则进入临界区执行代码;否则,该线程将被阻塞直到锁可用。
  • 特点:
    • 简单易用,适用于单一应用程序域内的线程同步。
    • 自动处理异常情况下的锁释放。
  • 示例:
private readonly object _lockObject = new object();public void CriticalSection()
{lock (_lockObject){// 访问共享资源的代码}
}

(2) Monitor 类

  • 原理: Monitor 提供了比 lock 更灵活的同步机制,允许手动控制进入和退出临界区。通过调用 Monitor.Enter 获取锁,Monitor.Exit 释放锁。此外,还支持条件变量(Wait, Pulse, PulseAll)以实现更复杂的同步逻辑。
  • 特点:
    • 支持超时等待获取锁的能力。
    • 可以与条件变量一起使用,支持复杂的同步模式。
  • 示例:
private readonly object _lockObject = new object();public void CriticalSection()
{try{Monitor.Enter(_lockObject);// 访问共享资源的代码}finally{Monitor.Exit(_lockObject);}
}

 


 

2. 跨进程互斥机制

(1) Mutex 类

  • 原理: Mutex 是一种内核级别的同步对象,可以用于跨进程的线程同步。当一个线程获取了 Mutex 对象的所有权时,其他线程会被阻塞,直到该线程释放 Mutex。
  • 特点:
    • 支持跨进程同步。
    • 性能较 lock 和 Monitor 稍低,因为它是内核对象。
  • 示例:
using System.Threading;private static Mutex _mutex = new Mutex();public void CriticalSection()
{_mutex.WaitOne(); // 获取锁try{// 访问共享资源的代码}finally{_mutex.ReleaseMutex(); // 释放锁}
}

 


 

3. 信号量机制

(1) Semaphore 和 SemaphoreSlim

  • 原理: 信号量是一种允许多个线程同时访问共享资源的同步机制,但限制最大并发数。Semaphore 支持跨进程,而 SemaphoreSlim 是轻量级版本,仅限于当前进程内使用。
  • 特点:
    • Semaphore 支持跨进程同步。
    • SemaphoreSlim 性能更高,适合单进程场景。

示例: (SemaphoreSlim)

using System.Threading;private static SemaphoreSlim _semaphore = new SemaphoreSlim(1); // 最大并发数为 1public async Task CriticalSectionAsync()
{await _semaphore.WaitAsync();try{// 访问共享资源的代码}finally{_semaphore.Release();}
}

 


 

4. 读写锁机制

(1) ReaderWriterLockSlim

  • 原理: ReaderWriterLockSlim 是一种优化的读写锁,允许多个线程同时读取共享资源,但只允许一个线程写入资源。通过 EnterReadLock、EnterWriteLock 和 EnterUpgradeableReadLock 方法分别管理读锁、写锁和可升级的读锁。
  • 特点:
    • 适合读多写少的场景。
    • 提高了读操作的并发性能。
  • 示例:
private static ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim();public void ReadOperation()
{_rwLock.EnterReadLock();try{// 读取共享资源的代码}finally{_rwLock.ExitReadLock();}
}public void WriteOperation()
{_rwLock.EnterWriteLock();try{// 写入共享资源的代码}finally{_rwLock.ExitWriteLock();}
}

 


 

5. 原子操作机制

(1) Interlocked 类

  • 原理: Interlocked 提供了一些原子操作方法,用于对简单数据类型(如整数)进行线程安全的操作。这些操作在硬件级别上保证了原子性,无需显式加锁。
  • 特点:
    • 高效,无需显式加锁。
    • 适用于简单的数值操作。
  • 示例:
using System.Diagnostics.Metrics;private int _counter = 0;public void IncrementCounter()
{Interlocked.Increment(ref _counter);
}public void DecrementCounter()
{Interlocked.Decrement(ref _counter);
}

 


 

6. 自旋锁机制

(1) SpinLock

  • 原理: SpinLock 是一种自旋锁,线程会不断循环检查锁是否可用,而不是进入等待状态。这种方式避免了上下文切换开销,但在长时间锁定时会浪费 CPU 资源。
  • 特点:
    • 适合非常短的临界区。
    • 避免上下文切换的开销。
  • 示例:
using System.Threading;private SpinLock _spinLock = new SpinLock();public void CriticalSection()
{bool lockTaken = false;try{_spinLock.Enter(ref lockTaken);// 访问共享资源的代码}finally{if (lockTaken)_spinLock.Exit();}
}

 

 

 

相关文章:

聊透多线程编程-线程池-8.C# 线程互斥实现方式

目录 1. 锁机制 (Locking Mechanisms) (1) lock 关键字 (2) Monitor 类 2. 跨进程互斥机制 3. 信号量机制 (1) Semaphore 和 SemaphoreSlim 4. 读写锁机制 (1) ReaderWriterLockSlim 5. 原子操作机制 (1) Interlocked 类 6. 自旋锁机制 (1) SpinLock 线程互斥是一种…...

渗透测试学习-概述

1.渗透测试 渗透测试( Penetration Testing )是指受信任的第三方通过模拟黑客的攻击技术与手段对目标网络、系统进行攻击测试,发现目标的安全隐患并给出安全加固建议的一种安全测试与评估方法。 具体来讲,渗透人员在不同的位置(…...

一键解锁Landsat 9地表温度计算!ENVI与ArcGIS Pro全流程详解(无需NASA大气校正)

为什么选择Landsat 9的L2SP数据? 之前:《ArcGIS与ENVI——基于landsat与Modis影像的遥感技术的生态环境质量评价》,基于Landsat前期的产品计算温度反演数据需要一系列复杂的步骤。 现在: Landsat 8-9的Collection 2 Level-2&…...

线代第七课:范德蒙德压缩

比如: 解析: 观看笔记来源: 《线性代数》教学视频 宋浩老师(2024年更新)...

Spark-SQL(一)

Spark SQL 概述 Spark SQL是Apache Spark用于处理结构化数据的模块 特点 1 易整合。无缝的整合了 SQL 查询和 Spark 编程 2 统一的数据访问。使用相同的方式连接不同的数据源 3 兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL 4 标准数据连接。通过 JDBC 或者 ODBC 来连…...

(自用)window防火墙关闭

自己老师忘了怎么关防火墙,导致每次都要重新找一遍,再下软件,所以写这篇 把这个地方打开可以看到被隔离的软件,然后点击还原即可使用了...

楼宇自控为建筑带来生机,具体表现在哪些方面?

在现代建筑领域,楼宇自控系统宛如一股清新的春风,为建筑赋予了蓬勃的生机与活力,从根本上改变了传统建筑的运行模式,使其朝着高效、智能、舒适的方向大步迈进。那么,楼宇自控究竟在哪些方面为建筑带来了如此显著的变化…...

asp.net Kestrel 和iis区别

Kestrel 和 IIS 都是用于托管 Web 应用程序的服务器,不过它们在多个方面存在显著差异,下面为你详细分析: 1. 所属平台与跨平台能力 Kestrel:是.NET Core 及后续版本的一部分,具备跨平台特性,可在 Windows…...

[原创](Modern C++)现代C++的关键性概念: 优雅地使用现代for循环语句

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …...

【第42节】windows双机调试环境搭建和SEH原理剖析

目录 一、windows双机调试环境 1.1 双机调试是什么 1.2 准备工作 1.3 配置步骤 1.3.1 安装 VirtualKD 1.3.2 将target文件夹拷贝到虚拟机 1.3.3 在主机上使用vmmon64.exe监控虚拟机 二、SEH 原理剖析 2.1 TEB 与 FS 概述 2.2 手工注册 SEH 一、windows双机调试环境 …...

一文读懂WPF系列之控件模版数据模板

WPF控件模版数据模板 控件模板(ControlTemplate)定义方式内联定义(直接写在ListBox中)资源字典中定义定义方式区别 TemplateBinding 用法对比普通Binding的区别常见误区何时使用 数据模板(DataTemplate)定义…...

Java设计模式实战:装饰模式在星巴克咖啡系统中的应用

一、装饰模式简介 装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前…...

L2TP实验(无图后补)

拓扑图 一、搭建拓扑并配置基础 IP 地址 设备选型与拓扑搭建:在 eNSP 中,拖入所需设备,包括 LAC(L2TP Access Concentrator,L2TP 接入集中器 )、LNS(L2TP Network Server,L2TP 网络服…...

AT_abc398_e [ABC398E] Tree Game 题解

题目传送门 题目大意 题目描述 本题是一道交互题(你的程序需要通过输入输出与评测系统进行交互)。 给定一棵包含 N N N 个顶点的树 G G G,顶点编号为 1 1 1 至 N N N。第 i i i 条边连接顶点 U i U_i Ui​ 和 V i V_i Vi​。 你和…...

使用SVM对心脏数据是否患病进行分类预测

作者简介 杜嘉宝,男,西安工程大学电子信息学院,2024级研究生 研究方向:变压器故障预警与检测 电子邮件:djb857497378gmail.com 王子谦,男,西安工程大学电子信息学院,2024级研究生&a…...

作业帮前端面试题及参考答案 (100道面试题-上)

HTML5 的优势是什么? HTML5 作为 HTML 语言的新一代标准,具有众多显著优势,为现代网页开发带来了诸多便利与革新。 在语义化方面,HTML5 引入了大量具有明确语义的标签,如<header>、<nav>、<article>、<section>、<aside>、<footer>等…...

docker部署GPUStack【Nvidia版本】

以下是使用 Docker 部署 GPUStack 的步骤和注意事项 参考文章&#xff1a;https://docs.gpustack.ai/latest/installation/docker-installation/ 1. 前置条件 安装 Docker&#xff1a;确保已安装 Docker 引擎&#xff08;建议最新稳定版&#xff09;。NVIDIA 环境支持&#x…...

处理Long类型长度超长导致前端精度丢失问题

1&#xff0c;问题场景 后端返回的Long类型的数据&#xff0c;超10000000000000000&#xff0c;前端处理的时候&#xff0c;数据被截断了。比如tchId: 11073477511443988481&#xff0c; 前端根据tchId获取下一环节信息的时候&#xff0c;传的tchId变成了11073477511443988400&…...

突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据

目录 一、Web Unlocker API简介二、开始使用Web Unlocker API1、首先进入控制台页面&#xff0c;点击左侧第一个tab键“代理 & 抓取基础设施”&#xff0c;找到“网页解锁器”&#xff0c;开始使用。2、进入网页解锁器页面后&#xff0c;填写通道名称&#xff0c;添加简短描…...

工业环境中的安全利器:如何挑选优质安全工具柜

工业生产的复杂环境里&#xff0c;安全工具柜可绝不是个简单的 “储物箱”&#xff0c;它是保障生产安全、提升工作效率的秘密武器。不管是电力维修车间里琳琅满目的绝缘工具&#xff0c;还是化工实验室里的精密仪器&#xff0c;安全工具柜都肩负着妥善收纳、保护的重任。那到底…...

UNITY 屏幕UI自适应

1.主要就是根据屏幕的选择根据尺寸 和UI的锚点和中心点来选择&#xff0c;也可以通过代码来动态修改 2.参考视频&#xff1a;Unity UGUI屏幕自适应看这个就够了_哔哩哔哩_bilibili...

【Linux】VIM 编辑器,编辑加速引擎

目录 vim中的五种常见模式介绍VIM的基本操作安装VIMVIM中的模式切换 VIM指令集命令模式指令集底行模式指令集视图模式指令集替换和插入模式 end vim中的五种常见模式介绍 正常/普通/命令模式【Normal mode】 控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动…...

【vue】class和styles绑定

一、 用来控制样式是否展示 二、style 行内样式 三、自定义属性绑定...

route

1、 传统web应用vs单页面web应用 1.1、传统web应用 传统web应用&#xff0c;又叫做多页面web应用&#xff1a;核心是一个web站点由多个HTML页面组成&#xff0c;点击时完成页面的切换&#xff0c;因为是切换到新的HTML页面上&#xff0c;所以当前页面会全部刷新。 1.2、单页…...

设备监控---保障企业IT基础设施稳定运行

引言 在数字化转型的今天&#xff0c;企业的IT基础设施规模不断扩大&#xff0c;网络设备、服务器、存储系统、云资源等构成了复杂的IT环境。如何确保这些设备的高效运行&#xff0c;及时发现并解决潜在问题&#xff0c;成为IT运维团队的核心任务。设备监控---作为IT运维的基础…...

牙科CAD技术方案

本牙科CAD系统旨在打造一个数字化牙科设计的高性能CAD/CAM软件&#xff0c;提供从修复体设计&#xff08;如牙冠、牙桥、贴面、活动义齿&#xff09;到生产准备的全流程解决方案。系统整合多源数据&#xff08;口内扫描、DICOM文件、颌骨运动数据等&#xff09;实现精准设计&am…...

Shell编程之循环语句

目录 for循环语句 for语句的结构 for语句应用示例 根据姓名列表批量添加用户 根据IP地址列表检查主机状态 使用while循环语句 while语句的结构 while语句应用示例 批量添加规则编号的用户 猜价格游戏 until循环语句 until语句的结构 until语句应用示例 计算1-50的…...

ECMAScript 11 新特性

ECMAScript 11 新特性 ECMAScript 6 新特性&#xff08;一&#xff09; ECMAScript 6 新特性&#xff08;二&#xff09; ECMAScript 7~10 新特性 ECMAScript 11 新特性&#xff08;本文&#xff09; 1. 私有属性 在类的内部&#xff0c;通过在属性前添加 # 来表示私有属性。 …...

恶意外联情况监测-火绒、DNSLookupView(联网、禁用网卡、仅主机模式请求测试)

恶意外联情况监测-火绒、DNSLookupView(联网、断网、仅主机模式时的请求测试) 结论: 联网时&#xff1a; wireshark、火绒捕获 域名请求、IP请求 DNSLookupView捕获域名请求&#xff0c;无法捕获IP请求 禁用网卡时: 仅DNSLookupView捕获域名请求&#xff0c;无法捕获IP请求。…...

顺序表与Myarraylist

对于所有编程语言来说&#xff0c;数据结构都是精华 一个计算机程序数据结构算法&#xff1b; 我在之前的博客中写了关于集合框架与泛型&#xff0c;这就是数据结构的开始&#xff0c;我今天说的便是数据结构的第一个线性数据结构--顺序表 顺序表是一种线性数据结构&#xf…...

Redis 版本变更的变化

Redis 版本变更的变化 以下是 Redis 主要版本的清单及其核心功能变化的梳理&#xff0c;按时间顺序整理关键版本演进 8版本没有整理&#xff1a; Redis 1.0 (2009) 初始版本&#xff1a;发布首个稳定版本&#xff0c;支持基本键值存储。 核心特性&#xff1a; 支持字符串&…...

kubernetes》》k8s》》ConfigMap 、Secret

configmap官网 ConfigMap是一种 API 对象&#xff0c;使用时&#xff0c; Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap将配置和Pod解耦&#xff0c;更易于配置文件的更改和管理。ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的…...

【React】基本语法

基本语法 通过jsx的语法可以在js中写html函数组件 / class组件的语法、父子组件传参、事件react 生命周期根据状态(数据)动态渲染组件 / 列表渲染 / 表单渲染class组件中的ref、ref回调函数 什么是react &#xff1f; 用于构建用户界面的 JavaScript 库&#xff0c;主要用于构建…...

ubunut24.04 bash和zsh同时使用conda

文章目录 ubunut24.04 bash和zsh同时使用conda功能一、安装miniconda3二、bash中初始化conda以及安装命令补全1. bash中初始化conda2. bash中安装conda命令补全功能 三、zsh中初始化conda以及安装命令补全1. zsh中初始化conda2. zsh中安装conda命令补全功能3. 在~/.zshrc文件中…...

深度学习入门:神经网络

目录 1. 从感知机到神经网络1.1 神经网络的例子1.2 复习感知机1.3 激活函数登场 2 激活函数2.1 sigmoid函数2.2 阶跃函数的实现2.3 阶跃函数的图形2.4 sigmoid函数的实现2.5 sigmoid函数和阶跃函数的比较2.6 非线性函数2.7 ReLU函数 3 多维数组的运算3.1 多维数组 恒等函数soft…...

Unity有限制状态机FSM

我是标题 前言有限制状态机框架框架图&#xff1a;主要代码&#xff1a; 前言 一般的小型游戏的状态机会使用一个枚举类来枚举所有的状态&#xff0c;然后使用一个switch case来处理所有状态的行为逻辑&#xff0c;但是用这种方式会形成大量的冗余&#xff0c;因为所有的行为逻…...

bash的特性-命令和文件自动补全

在Linux或Unix操作系统中&#xff0c;Bash&#xff08;Bourne Again SHell&#xff09;是最常用的命令行解释器之一。它提供了丰富的功能来提升用户的交互体验&#xff0c;其中命令和文件名的自动补全是提高效率的一大利器。本文将详细介绍Bash中的自动补全功能&#xff0c;包括…...

聊聊价值投资

投资的必要性 如果手上现在有10w元&#xff0c;投资时间是50年&#xff0c;就算年化收益率只有15%&#xff0c;最终的财富值也会超过1亿元。而且通货膨胀会让你的存款购买力越来越少&#xff0c;如果你有无法及时花出去的钱&#xff0c;投资是必要的。05年的时候我家楼下的包子…...

ADI的BF561双核DSP怎么做开发,我来说一说(十六)触摸屏的设计

作者的话 ADI的双核DSP&#xff0c;最早的一颗是Blackfin系列的BF561&#xff0c;这颗DSP我用了很久&#xff0c;比较熟悉&#xff0c;且写过一些给新手的教程。 硬件准备 ADZS-BF561-EZKIT开发板&#xff1a;ADI原厂评估板 AD-ICE20000仿真器&#xff1a;ADI现阶段性能最好…...

基于labview的2PSK调制与解调

前面板如上图所示。 以上为产生随机序列的程序 以上为星座图程序 如需要源代码可联系我...

2021-11-01 C++输入十个数求最大最小和第二大第二小的值

缘由c语言输入十个数求最大最小和第二大第二小的值-编程语言-CSDN问答 这是个有意思的题目&#xff0c;考虑可扩展...如果是4个元素的数组&#xff0c;实现O&#xff08;N&#xff09;排序 void 输入十个数求最大最小和第二大第二小的值() {//缘由https://ask.csdn.net/ques…...

红人矩阵化运营策略:2025跨境电商如何高效布局海外红人营销

在全球社交媒体营销日益精细化的今天&#xff0c;跨境电商品牌正从单一红人合作转向系统化、团队化的“红人矩阵化运营”。尤其在TikTok、Instagram、YouTube等主流平台逐渐成熟的背景下&#xff0c;如何构建高效的海外红人营销矩阵&#xff0c;成为品牌实现全域曝光与精准转化…...

c# Kestrel

Kestrel 是 .NET 中用于 ASP.NET Core 应用程序的跨平台 Web 服务器。它是轻量级且高性能的&#xff0c;能够处理大量并发连接&#xff0c;常被用作 ASP.NET Core 应用的默认服务器。以下为你介绍 Kestrel 的基本使用和配置&#xff1a; 基本使用 创建一个简单的 ASP.NET Cor…...

算法训练之贪心

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

ThreeJs实现裸眼3D地球仪

一、实现效果 使用Three.js实现裸眼3D地球仪 二、实现代码 代码如下&#xff1a; <!DOCTYPE html> <html> <head><title>3D Earth</title><style>body { margin: 0; }canvas { display: block; }</style> </head> <body…...

0x07.Redis 的 hash 是什么?

回答重点: Redis 的 Hash 是一种键值对集合,允许将多个字段与其对应的值存储在同一个键中,从而方便管理和操作关联数据。它的主要特点包括: 高效存储:Hash 采用哈希表实现,能够在内存中高效地存储和操作小规模的数据集,非常适合存储对象的属性。快速操作:支持对字段的…...

今日一记:逆序打印字符、五人年龄计算、对N个数排序

今日进行三道题的练习 题目一&#xff1a;逆序打印字符 核心需求&#xff1a;将输入的n个字符以相反顺序输出。 算法分析&#xff1a; 递归思想&#xff1a; 递归函数先读取字符&#xff0c;直到输入结束&#xff08;如换行符或EOF&#xff09;。 在递归返回时打印字符&…...

【笔记】对抗训练-GAN

对抗训练-GAN 深度学习中 GAN 的对抗目标函数详解与最优解推导一、GAN 的基本对抗目标函数二、判别器与生成器的博弈目标三、判别器的最优解推导四、最优判别器的含义五、总结六、WGAN 的动机&#xff08;为后续铺垫&#xff09; 深度学习中 GAN 的对抗目标函数详解与最优解推导…...

Python六大数据类型与可变类型

数字类型包括整型&#xff08;int&#xff09;&#xff0c;浮点型&#xff08;float&#xff09;&#xff0c;布尔型&#xff08;bool&#xff09;&#xff0c;复数型&#xff08;complex&#xff09;。整型只能存储整数&#xff0c;浮点型可以存储整数和小数&#xff0c;布尔型…...

回溯-day65

回溯 什莫事回溯 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式 回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让回溯法高效一些&#xff0c;可以加一些剪枝的操作&#xff0c;但也改不了回溯法就是穷举的本…...