Mutex 互斥锁-出现被放弃的mutex
背景:同时开启两个线程调用同一函数,使用Mutex来保证一个线程独占一个资源的访问。因为某些需求,临时abort了thread1 ,这时程序报错,—出现被放弃的mutex
static Mutex mutex;static Thread thread1, thread2;static void Main(string[] args){ Create a new Mutex. The creating thread does not own the mutex. mutex = new Mutex();thread1 = new Thread(new ThreadStart(Func));thread2 = new Thread(new ThreadStart(Func));thread1.Start();thread2.Start();}private static void Func(){mutex.WaitOne();//do somethingmutex.ReleaseMutex();}
分析:
- thread1 被abort时,有可能正在执行do something的操作,所以终止线程时,因为占有Mutex 对象后,并没有释放它,这是thread2调用mutex.WaitOne();就会报错,提示出现被放弃的mutex,这是严重的编程错误,引发 AbandonedMutexException。
- 修改函数,并且不再终止thread1 线程。
private static void Func()
{for (int i = 0; i < 3; i++){mutex.WaitOne();//do something}mutex.ReleaseMutex();
}
这时,thread1 执行完后,thread2执行报错。
1)为什么thread1 执行时,调用了3次mutex.WaitOne();没有报错呢?因为thread1 执行时,系统检查发现mutex时被当前线程占用,就直接返回了。换言之,waitOne是获取Mutex锁的方式,所以没有报错。
2)为什么thread2执行会报错?thread1 对锁会执行3次获取,但是在在线程结束时,只释放了一次,这样等另一个线程调用锁时,发现被一个结束的线程独占着,就会报错了。
2)如果调用1次mutex.WaitOne();两次ReleaseMutex 那么由于当前线程实际上是不占有锁的 那么会抛出异常。
Mutex 互斥锁-出现被放弃的mutex相关推荐
- golang sync.Mutex 互斥锁 使用实例
实例: var mutex sync.Mutex //互斥锁 func printer(str string){mutex.Lock() //加锁defer mutex.Unlock() //解锁fo ...
- Linux系统编程:使用mutex互斥锁和条件变量实现多个生成者和消费者模型
实现代码 如题,使用mutex互斥锁和条件变量实现多个生成者和消费者模型. 直接上代码,需要线程中的互斥锁和条件变量的相关知识进行支撑.这里就不细说了呀,代码中有一定的注释. #include < ...
- Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)
同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...
- golang mutex互斥锁分析
互斥锁:没有读锁写锁之分,同一时刻,只能有一个gorutine获取一把锁 数据结构设计: type Mutex struct {state int32 // 将一个32位整数拆分为 当前阻塞的goro ...
- linux之mutex(互斥锁)
在Posix Thread中定义有一套专门用于线程同步的mutex函数 1. 创建和销毁 有两种方法创建互斥锁,静态方式和动态方式.POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZ ...
- golang 1.10 mutex互斥锁源码
Mutex锁分为normal模式和starvation模式.一开始默认处于normal模式.在normal模式中,每个新加入竞争锁行列的协程都会直接参与到锁的竞争当中来,而处于starvation模式 ...
- MySQL mutex互斥锁
在事务机制中,锁机制是为了保证高并发,数据一致性的重要实现方式.MySQL除了Innodb引擎层面的行锁,还有latch锁.latch锁的作用资源协调处理.包含表句柄,线程,cpu线程,内存池等.其保 ...
- Go sync.Mutex互斥锁的学习
1. 前言 1.1 基础回顾 原子操作:指那些不能够被打断的操作被称为原子操作,当有一个CPU在访问这块内容addr时,其他CPU就不能访问. CAS:比较及交换,其实也属于原子操作,但它是非阻塞的, ...
- Linux系统编程37:多线程之什么是临界区和临界资源以及如何使用mutex互斥锁
文章目录 (1)临界区,临界资源和原子性问题 (2)互斥量(锁) A:互斥锁 B:锁的作用 C:互斥锁实现的原理 (3)可重入函数和线程安全 A:可重入函数和线程安全 B:常见的线程安全和不安全情况 ...
最新文章
- jquery模拟LCD 时钟
- Linux中设置vi编辑器的编码格式以及使用
- 用ssh远程登录服务器时,怎么直接以root用户登录?(需要修改配置,如果不想修改,可以先用普通用户登录再su切换到root用户)
- 微服务网关Ocelot
- 分表后需要注意的二三事
- mybatisplus 结果_MyBatis Plus 将查询结果封装到指定实体
- zemax双胶合消色差透镜设计
- 看电影学英语是学习口语的最佳方式
- CAD打印线条太粗、线条颜色设置
- 网络流量分析/网络流量监测
- 《初级会计实务》考试学习分享之第八章 ——政府会计基础【考试大纲】
- Android SAX解析远程服务器端的xml,防止解析的时候出现空格或者标点符号再次解析的方法
- podcast什么意思php,什么是podcast?
- leetcode日记
- C盘爆满怎么办?C盘没有空间了怎么办?九种方法释放C盘空间
- synchronized各种使用场景
- matlab 变压器 漏感,中频变压器漏感参数解析计算方法.doc
- System32和SysWOW64
- IGARSS2019-项目实战总结-keras
- c语言分治法求众数重数_分治算法:求众数及其重数
热门文章
- [童趣]搞笑幼儿经典语录
- 中华老字号“桂发祥“,走上了“狗不理“的老路?
- RabbitMQ-fanout广播模式
- 在这里给大家安利一个好的免费的虚拟主机云服务器使用地址
- HEC-HMS和HEC-RAS快速入门、防洪评价报告编制及洪水建模、洪水危险性评价等应用
- 查重合并mysql语句_查重、替换、2个表格合并
- 基于asp.net739办公自动化OA系统
- 推荐一款好用的数据安全工具
- 调节e18-d80nk的测量距离_水准仪、经纬仪、全站仪以及GPS测量使用教程,操作就是这么简单...
- 虚拟机red hat linux下载,Red Hat Enterprise Linux 官方正式版镜像下载