首页 > 编程语言 >C#线程同步

C#线程同步

时间:2023-05-16 13:47:00浏览次数:48  
标签:同步 obj Monitor 获取 C# 队列 线程 等待

lock (obj){//synchronizedregionforobj}等价于Monitor.Enter(obj)等价于try{// synchronizedregionforobj}finally{Monitor.Exit(obj);}

Monitor.Enter:在指定对象上获取排他锁

Monitor.Enter方法,如果排它锁获取不到(其他线程在占用obj锁定的资源),则该方法会一直等待(等待线程来获取obj锁定的资源),注意的是Monitor.enter如果获取到排他锁了,就不会卡死在那里,如果获取不到排他锁,就一直等待

Monitor.TryEnter

可以指定超时时间,指处于等待状态的线程等待另一个线程锁定obj的时间超过多久,这个处在等待状态的线程就不再等待了。

如下是例子:

 

Monitor在锁对象obj上会维持两个线程队列以及一个引用T

1)T是对当前获得了obj锁的线程的引用,设此线程为CurThread

2)  就绪队列:该队列里的线程已准备好获取obj锁,当obj锁被CurThread释放后,(CurrThread可通过Monitor.Exit(obj)或Monitor.Wait(obj)来释放其所获的obj锁)这些线程就会去竞争obj锁,获得obj锁的线程将被T引用; 线程调用Monitor.Enter(obj)或Monitor.TryEnter(obj)将会使该线程直接进入就绪队列。

3)等待队列:

其上的线程是因为调用了Monitor.Wait(obj)而进入W队列的;W上的线程不会被OS直接调度执行,也就是说它们没有准备好获取obj锁,就是说在等待队列上的线程不能去获得obj锁。当前获得obj锁的线程CurrThread调用Monitor.Pulse(obj)或Monitor.PulseAll(obj)后会使W队列中的第一个等待线程或所有等待线程被移至R队列,这时被移至R队列的这些线程就有机会被OS直接调度执行,也就是有可以去竞争obj锁。

4)Monitor的成员方法:

Monitor.Enter(obj)/Monitor.TryEnter(obj) : 线程会进入R队列以等待获取obj锁

Monitor.Exit(obj) :  线程释放obj锁(只有获取了obj锁的线程才能执行Monitor.Exit(obj))

Monitor.Wait(obj):  线程释放当前获得的obj锁,然后进入W队列并阻塞,直到当前线程重新获取该锁。

Monitor.Pulse(obj) :  将W队列中的第一个等待线程移至R队列中以使第一个线程有机会获取obj锁

Monitor.PulseAll(obj): 将W队列中的所有等待线程移至R队列以使得这些线程有机会获得obj锁

 

标签:同步,obj,Monitor,获取,C#,队列,线程,等待
From: https://www.cnblogs.com/zhqimi/p/17403770.html

相关文章

  • 基于STM32F407/STM32H743芯片和SOEM的E therCAT主站源码 提供配套CUBE工程和。
    基于STM32F407/STM32H743芯片和SOEM的EtherCAT主站源码提供配套CUBE工程和。可配套正点原子探索者开发板使用,或任何带以太网口的407/H743板子。支持DC同步。可配合汇川IS620N、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B/A6B和欧姆龙G5系列驱动器使用,或提供想适配的......
  • 《c++徒步》vs界面详解
    vs2010字符集:多字节字符集和Unicode字符集是不同的字符集标准,主要区别如下:字符编码范围不同:多字节字符集使用单字节或多个字节来表示字符,编码范围较窄,通常只能表示本地语言的字符集。Unicode字符集则是全球通用的字符编码标准,可以同时表示全球范围内的多种语言字符集。字......
  • C#导入CAD DXF格式的图纸文件源码 结合了. net dxf库文件 C#写的CAD DXF格式文件导入
    C#导入CADDXF格式的图纸文件源码结合了.netdxf库文件C#写的CADDXF格式文件导入,自动解析图形文件坐标并显示,看懂源代码就可根据实际要求应用到项目,非常具有学习价值ID:5275638923543619......
  • J. Joy of Handcraft
    J.JoyofHandcraft题意:给定n个灯泡的时间周期以及对应的亮度值,求1~m的时刻,每一时刻的灯泡最大亮度分析:按时间轴建树,维护时间区间的亮度最大值按亮度值递减排序,遍历灯泡时只modify为相同周期中亮度值最大的一个灯泡作为区间亮度最大值区间修改,单点查询实现:#incl......
  • 基于国产M0核MCU平台,全开源双电阻采样FOC高压 风机量产程序,包含龙博格电机观测器,SVPW
    基于国产M0核MCU平台,全开源双电阻采样FOC高压风机量产程序,包含龙博格电机观测器,SVPWM,顺逆风启动,五段式与七段式调制等源码,完全可以移植到别的MCU平台。适合电机算法研究ID:19200640946461576......
  • FX5U FX40SSC 程序 FX5U FX 40SSC运动控制模块程序块 自己整合的针对FX 40SSC模块的
    FX5UFX40SSC程序FX5UFX40SSC运动控制模块程序块自己整合的针对FX40SSC模块的功能块,支持点动故障码状态码相对定位绝对定位直接1指定轴号就可以控制对应的轴可以大幅缩短程序开发时间,减少BUG出现机率。ID:8715641034653828......
  • STM32vcu整车simulink应用层模型 模型包含高压上下电,车辆蠕
    STM32vcu整车simulink应用层模型模型包含高压上下电,车辆蠕动,驻坡功能,能量管理,档位管理,续航里程,定速巡航等等。每个功能都对应有详细的pdf文档详细说明,进入条件,退出条件,以及标定量详细说明。程序已经实车测试完成,注意,项目级别的。模型全局仿真通过,非常适合开发新能源汽车的工程师们......
  • SSH 整合 Activiti
    Spring/Activiti/JPA(Hibernate)Integration[url]http://www.kaixinwenda.com/article-derek_zhang_-8364934.html[/url]Act的官方推荐的orm是mybatis,由于项目需要hibernate,所以做了一次Act和SSH的整合。1.首先添加jar依赖。act的engine.jar,spring.jar包。项目前期比较懒所......
  • CentOS7中使用Git从github上克隆一个仓库
     1.显示git的版本信息(验证是否安装Git)git--version或者yuminfogit 2.查看git的配置gitconfiguser.namegitconfiguser.email如果没有配置git的用户名和用户的邮箱(名字可以任意指定),可以使用一下命令配置。--global的作用是全局有效,也就是对当前的linu......
  • 汽车充电装备新能源汽车6kw充电机,DC to DC双向升降压48~54VDC输入,输出320VDC,双向可以
    汽车充电装备新能源汽车6kw充电机,DCtoDC双向升降压48~54VDC输入,输出320VDC,双向可以输入,输出。MCUTMS320C2系列TIDSP高性能芯片PI2SC0435T方案,驱动英飞凌的MOS管DC电源,有原理图,PCB文件,485和CAN协议文件,程序代码;调试文件,规格书,测试报告。ID:7796683605367539......