C#对线程同步的应用
什么是线程同步?线程同步的应用场景有哪些?在C#中有哪些线程同步方式?下面对这些问题做一个总结,让大家在面试的时候遇到这些问题能够游刃有余。
线程同步是指在多线程环境下,多个线程同时访问共享资源时,确保数据一致性和正确性的一种机制。以下是线程同步的主要应用场景和常用方式,以及每种方式的简单代码示例。
应用场景
- 共享资源的保护
- 多个线程同时读写共享资源时,防止数据竞争和不一致。
- 线程间的通信
- 一个线程等待另一个线程完成某些任务或传递数据。
- 避免死锁
- 多线程并发访问资源时,通过合理设计同步机制,避免资源争用导致的死锁。
- 线程协调
- 控制线程的执行顺序或实现生产者-消费者模式。
线程同步方式与示例
- 锁(lock / Monitor)
用于同步对共享资源的访问,确保同时只有一个线程可以访问资源。
class Program
{private static readonly object _lock = new object();private static int _counter = 0;static void Main(){Thread t1 = new Thread(IncrementCounter);Thread t2 = new Thread(IncrementCounter);t1.Start();t2.Start();t1.Join();t2.Join();Console.WriteLine($"Final Counter: {_counter}");}static void IncrementCounter(){for (int i = 0; i < 1000; i++){lock (_lock){_counter++;}}}
}
- 信号量(Semaphore / SemaphoreSlim)
用于限制对某些资源的访问线程数。
class Program
{private static SemaphoreSlim _semaphore = new SemaphoreSlim(2);static void Main(){for (int i = 1; i <= 5; i++){int id = i;new Thread(() => AccessResource(id)).Start();}}static void AccessResource(int id){Console.WriteLine($"Thread {id} is waiting to enter...");_semaphore.Wait();Console.WriteLine($"Thread {id} entered.");Thread.Sleep(2000); // Simulating workConsole.WriteLine($"Thread {id} is leaving.");_semaphore.Release();}
}
- 互斥(Mutex)
用于跨进程同步资源。
class Program
{private static Mutex _mutex = new Mutex();static void Main(){for (int i = 1; i <= 3; i++){new Thread(AccessResource).Start(i);}}static void AccessResource(object id){Console.WriteLine($"Thread {id} waiting for mutex...");_mutex.WaitOne();Console.WriteLine($"Thread {id} acquired mutex.");Thread.Sleep(2000);Console.WriteLine($"Thread {id} releasing mutex.");_mutex.ReleaseMutex();}
}
- 手动重置事件(ManualResetEvent)
允许一个线程通知其他线程可以继续。
class Program
{private static ManualResetEvent _mre = new ManualResetEvent(false);static void Main(){new Thread(WaitForSignal).Start();Console.WriteLine("Main thread doing work...");Thread.Sleep(2000);Console.WriteLine("Signal other threads to proceed.");_mre.Set();}static void WaitForSignal(){Console.WriteLine("Thread waiting for signal...");_mre.WaitOne();Console.WriteLine("Thread received signal!");}
}
- 自动重置事件(AutoResetEvent)
每次调用 Set 后,自动重置为非信号状态。
class Program
{private static AutoResetEvent _are = new AutoResetEvent(false);static void Main(){new Thread(WaitForSignal).Start();Console.WriteLine("Main thread doing work...");Thread.Sleep(2000);Console.WriteLine("Signal other thread to proceed.");_are.Set();}static void WaitForSignal(){Console.WriteLine("Thread waiting for signal...");_are.WaitOne();Console.WriteLine("Thread received signal!");}
}
- 信号量栅栏(Barrier)
允许多个线程到达某个同步点后再继续执行。
class Program
{private static Barrier _barrier = new Barrier(3, b => Console.WriteLine("All threads reached barrier."));static void Main(){for (int i = 1; i <= 3; i++){new Thread(Work).Start(i);}}static void Work(object id){Console.WriteLine($"Thread {id} doing work...");Thread.Sleep(new Random().Next(1000, 3000));Console.WriteLine($"Thread {id} waiting at barrier.");_barrier.SignalAndWait();Console.WriteLine($"Thread {id} passed barrier.");}
}
- 读写锁(ReaderWriterLockSlim)
提供多个线程的读操作,但写操作是互斥的。
class Program
{private static ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();private static List<int> _data = new List<int>();static void Main(){new Thread(ReadData).Start();new Thread(WriteData).Start();}static void ReadData(){_lock.EnterReadLock();try{Console.WriteLine($"Read thread reading data: {string.Join(", ", _data)}");}finally{_lock.ExitReadLock();}}static void WriteData(){_lock.EnterWriteLock();try{_data.Add(new Random().Next(100));Console.WriteLine("Write thread updated data.");}finally{_lock.ExitWriteLock();}}
}
以上是常用的线程同步方式及其简单示例代码,您可以根据具体需求选择合适的方式来保证线程安全。希望对大家有所帮助。
相关文章:
C#对线程同步的应用
什么是线程同步?线程同步的应用场景有哪些?在C#中有哪些线程同步方式?下面对这些问题做一个总结,让大家在面试的时候遇到这些问题能够游刃有余。 线程同步是指在多线程环境下,多个线程同时访问共享资源时,确…...
基于微信小程序的面部动作检测系统
引言 本技术文档旨在详细阐述一个基于微信小程序的面部动作检测系统的技术路线、实现方法及关键技术框架。系统的核心功能包括检测用户的左右转头、眨眼和张嘴动作,并根据检测结果逐步引导用户完成任务。为确保系统的安全性和准确性,特别是防止用户通过…...
Activation Functions
Chapter4:Activation Functions 声明:本篇博客笔记来源于《Neural Networks from scratch in Python》,作者的youtube 其实关于神经网络的入门博主已经写过几篇了,这里就不再赘述,附上链接。 1.一文窥见神经网络 2.神经…...
《Vue3实战教程》37:Vue3生产部署
如果您有疑问,请观看视频教程《Vue3实战教程》 生产部署 开发环境 vs. 生产环境 在开发过程中,Vue 提供了许多功能来提升开发体验: 对常见错误和隐患的警告对组件 props / 自定义事件的校验响应性调试钩子开发工具集成 然而ÿ…...
Linux:各发行版及其包管理工具
相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Debian 包管理工具:dpkg(低级包管理器)、apt(高级包管理器,建立在dpkg基础上)包格式:…...
【计算机网络】课程 作业一 搭建连续覆盖的办公网络
作业一 搭建连续覆盖的办公网络 题目:论述题(共1题,100分) 充分利用所学习的数据链路层局域网知识,加上物理层的基础知识,请给一个办公场所(三层,每层约100平方)…...
C++ 设计模式:单例模式(Singleton Pattern)
链接:C 设计模式 链接:C 设计模式 - 享元模式 单例模式(Singleton Pattern)是创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式在需要全局共享资源或控制实例数量的…...
OpenCV调整图像亮度和对比度
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、基本方法---线性变换 // 亮度和对比度调整 cv::Mat adjustBrightnessContrast(const cv::Mat& src, double alpha, int beta) {cv::Mat dst;src.convertTo(dst, -1, alpha, beta);return dst; }// 使用…...
Kafka Offset explorer使用
Kafka集群配置好以后以后运维这边先用工具测试一下,便于rd展开后续的工作,本地调试时一般使用Offset explorer工具进行连接 使用SASL(Simple Authentication and Security Layer)验证方式 使用SCRAM-SHA-256(Salted Challenge Response Authentication…...
二维码文件在线管理系统-收费版
需求背景 如果大家想要在网上管理自己的文件,而且需要生成二维码,下面推荐【草料二维码】,这个系统很好。特别适合那些制造业,实体业的使用手册,你可以生成一个二维码,贴在设备上,然后这个二维码…...
UE4.27 Android环境下获取手机电量
获取电量方法 使用的方法时FAndroidMisc::GetBatteryLevel(); 出现的问题 但是在电脑上编译时发现,会发现编译无法通过。 因为安卓环境下编译时,包含 #include "Android/AndroidPlatformMisc.h" 头文件是可以正常链接的,但在电…...
vue-i18n报错
1. 开发环境报错Uncaught (in promise) TypeError: ‘set’ on proxy: trap returned falsish for property ‘$t’ legacy需要设置为false const i18n createI18n({legacy: false,// 默认语言locale: lang,// 设置语言环境messages, })2. 打包配置tsc --noEmit时报错&#…...
Docker新手:在tencent云上实现Python服务打包到容器
1 使用docker的原因 一致性和可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致,减少了“在我的机器上可以运行”的问题。 隔离性ÿ…...
React基础知识学习
学习React前端框架是一个系统而深入的过程,以下是一份详细的学习指南: 一、React基础知识 React简介 React是一个用于构建用户界面的JavaScript库,由Facebook开发和维护。它强调组件化和声明式编程,使得构建复杂的用户界面变得更…...
ES IK分词器插件
前言 ES中默认了许多分词器,但是对中文的支持并不友好,IK分词器是一个专门为中文文本设计的分词工具,它不是ES的内置组件,而是一个需要单独安装和配置的插件。 Ik分词器的下载安装(Winows 版本) 下载地址:…...
二十三种设计模式-抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。这种模式主要用于系统需要独立于其产品的创建逻辑时,并且…...
python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)
官方文档:https://docs.opencv.org/4.10.0/d1/d89/tutorial_py_orb.html SIFT/SURF/ORB对比 https://www.bilibili.com/video/BV1Yw411S7hH?spm_id_from333.788.player.switch&vd_source26bb43d70f463acac2b0cce092be2eaa&p80 ORB代码 import numpy a…...
高阶数据结构----布隆过滤器和位图
(一)位图 位图是用来存放某种状态的,因为一个bit上只能存0和1所以一般只有两种状态的情况下适合用位图,所以非常适合判断数据在或者不在,而且位图十分节省空间,很适合于海量数据,且容易存储&…...
VScode使用密钥进行ssh连接服务器方法
如何正常连接ssh的方式可以看我原来那篇文章:Windows上使用VSCode连接远程服务器ssh 1.连接 点击ssh加号,然后关键点在第2步的书写上 2.命令 2的位置写命令: ssh -i "C:\Users\userName\.ssh\id_rsa" usernameIP -p 端口号 端…...
艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!
Redis 宣布推出其首款专为 VS Code 设计的 Redis 扩展。这一扩展将 Redis 功能直接整合进您的集成开发环境(IDE),旨在简化您的工作流程,提升工作效率。 我们一直致力于构建强大的开发者生态系统,并在您工作的每一步提…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
