首页 > 编程语言 >c#线程同步&线程安全

c#线程同步&线程安全

时间:2024-10-13 14:23:56浏览次数:7  
标签:同步 限制 c# 访问 读锁 线程 排它 资源

一:线程同步

由于现代计算机CPU的多线程技术普及,所有的资源访问都要面临一个问题:在多线程情况下,如何有序访问资源?为此,线程同步技术应运而生。

线程同步的技术分三类:

1.排它锁:

排它锁,顾名思义,独占(资源)、排他(其他线程或者进程)。排它锁每一次只允许一个线程执行特定的活动或者代码。其目的是让所有线程共享写的状态,但相互之间不受影响。排它锁有以下几种:

①Moniter(lock)

②Mutex

③SpinkLock

以下详细解释每一种锁:

Lock锁:

这种锁最常见最常用的一种结构,其他两种锁多样于处理特定的场景。这种锁保证每一次只有一个线程锁定同步对象,其他线程则被阻塞,直到锁的释放。如果参与竞争的锁有多个,则它们需要在准备队列中排队等待,并以先到先得的方式获得资源的访问权(个别平台版本或者运行环境有细微差异,无法保证完全如此)。排它锁强制以顺序方式访问被锁访问的资源,从而实现了被访问资源的有序访问。另外,Lock锁其实是Moniter锁的语法糖,其实现底层是运用Moniter实现的。

Mutex锁:

这种锁的威力巨大,应用广泛,既可以实现线程访问资源的限制,又可以实现进程之间的访问限制。这是一种经典且应用广泛的技术,在windows及unix系统中均可以使用。其典型的使用语句:mutex.WaitOne()和mutex.ReleaseMutex().

SpinkLock:

可用于实现微优化,可以在高并发的场景下减少上下文切换,提高允许效率。但如果使用不当,则会造成CPU使用率升高,为了改进其缺点,在此基础上出现了混合锁,其原理大致为:在规定的时间限制内其首先为自旋锁,如果超时后还未完成,则转为排他锁。

说明:

同步对象一般选择在各个参与的线程中都是可见的对象,但该对象必须是引用类型的对象,而且通常是私有的(因为通常用于封装逻辑)。另外锁之间可以嵌套,在嵌套时,线程会只阻塞在最外层的锁上。

2.非排它锁

①semaphore

②ReaderWriterLock

首先说semaphore,这种结构会定义一个线程容量及同时访问资源的线程容量。通过调整线程总容量及访问容量来限制资源访问的并发性。这种结构也可以用于跨进程对资源的访问限制,但仅限于windows平台,而Mutex也可以在unix平台下工作。这种结构较复杂切耗时较多,目前其轻量级的实现semaphoreslim已经大行其道,因为其已经进行了一系列优化以减少了并发延迟。

再说ReaderWriterLock.这种锁如同其名称一样,主要用来对读多写少的业务场景设计的,这种结构有两种锁:读锁和写锁。两种锁的排斥关系为:读读不限制,读写限制,写读限制。或者说读锁兼容其他的读锁,而写锁是全局性的排他锁。这种锁使用的时候有一个很细微且非常关键的场景:假如先读后写,那么在锁转换的时候(因为开始是先读,读锁之间没有限制,当一个线程开始转换为写锁时,不幸被别的线程捷足先登,抢先获得了写锁并完成了写锁),当线程获取写锁后发现资源与当初读的时候不一致怎么办?换句话说,读锁与写锁之间是独立的且不是原子的,在两种锁转换之间,对象资源发生了变化,如果再进一步对资源进行写入,岂不是驴唇不对马嘴了?别说,还真有聪明人,早就想到了这个问题并且解决了这个问题,解决的关键在于,设计者将读锁转换写锁的这个环节设计成了原子级别,这样就不会存在读写割裂问题了,也就避免了写入脏数据问题,而这种方案称之为:可升级锁。

 3.信号发送机构

最简单的信号发送记过是事件等待句柄,其有三种实现方式,分别为:AutoResetEvent,ManualresetEvent,CountdownEvent。

详情(待补充)

标签:同步,限制,c#,访问,读锁,线程,排它,资源
From: https://www.cnblogs.com/jizhong/p/18462205

相关文章

  • P11022 「LAOI-6」Yet Another Graph Coloration Problem
    P11022「LAOI-6」YetAnotherGraphColorationProblem-洛谷|计算机科学教育新生态(luogu.com.cn)关于无解情况,如果这个图有两块连通块,那么不可能同时有黑色白色,假设\(1,2\)连通块,设\(1\)中有黑色,因为\(2\)中点不能到\(1\),所以\(2\)中只能是黑色,又因为\(2\)中......
  • C++STL~~map
    文章目录序列式容器和关联式容器一、map的概念二、map的使用三、map&multimap的差异四、map的练习五、总结序列式容器和关联式容器序列式容器前面已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑......
  • [LeetCode] 315. 计算右侧小于当前元素的个数
    题目描述:给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。题目链接:.-力扣(LeetCode)题目主要思路:其实跟“LCR170.交易逆序对的总数”那道题差不多,就是多了个数组来......
  • iDirect IQ200 REST API
    iDirectIQ200RESTAPI ######################################HTTP基本认证方式(命令行参数中直接输入用户名和密码)获取ModemLED状态信息###请求命令curl-uadmin:P@55w0rd!-isk'https://172.28.170.217/api/1.0/terminal/device/led'#响应头数据HTTP......
  • Mac下使用VSCode开发react native快捷键与终端命令
    一、快捷键在macOS下使用VSCode开发ReactNative时,掌握常用的快捷键可以提高开发效率。以下是一些常用的VSCode快捷键,特别适用于ReactNative开发:1、基础快捷键打开命令面板:Cmd+Shift+P打开VSCode的所有命令面板,可以快速执行命令。打开终端:Ctrl+~......
  • 关于使用plsql操作oracle的一点小技巧和几个常用的查询语句BU
    plsql是什么:就是这个,专门操作oracle的一个工具,好用还免费。创建一个测试表:createtableStudent(Idnumbernotnull,Namevarchar(20),Agenumber,Gradenumber,Gendervarchar(2))里面的varchar2()是oracle自己专门的字符类型,用就行了。光标移到表上,右键选择Descr......
  • 【Azure Cloud Service】使用RESTAPI更新Cloud Service(Extended Support) 中所配置的
    问题描述当根据CloudService(ExtendedSupport)文档更新证书(https://docs.azure.cn/zh-cn/cloud-services-extended-support/certificates-and-key-vault)时,如果遇见旧的证书(如中间证书,根证书)信息保存在KeyVaultSecret中,而更新的时候,只能从KeyVault证书中匹配到服务......
  • 实验1 现代C++编程初体验
    Task1code1.cpp1//现代C++标准库、算法库体验2//本例用到以下内容:3//1.字符串string,动态数组容器类vector、迭代器4//2.算法库:反转元素次序、旋转元素5//3.函数模板、const引用作为形参67#include<iostream>8#include<string>......
  • Nuxt.js 应用中的 kit:compatibility 事件钩子详解
    title:Nuxt.js应用中的kit:compatibility事件钩子详解date:2024/10/11updated:2024/10/11author:cmdragonexcerpt:kit:compatibility是处理浏览器兼容性问题的有效工具。正如本篇文章中所述,合理地利用这一钩子可以提升用户体验,并确保应用在不同环境中都能稳......
  • Centos7.9安装docker(国内)
    由于不能访问国外网络所以需要修改为阿里云镜像地址sudotee/etc/yum.repos.d/CentOS-Base.repo<<EOF[centos]name=CentOS-\$releasever-Basebaseurl=http://mirrors.aliyun.com/centos/\$releasever/os/\$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM......