背景:同时开启两个线程调用同一函数,使用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();}

分析:

  1. thread1 被abort时,有可能正在执行do something的操作,所以终止线程时,因为占有Mutex 对象后,并没有释放它,这是thread2调用mutex.WaitOne();就会报错,提示出现被放弃的mutex,这是严重的编程错误,引发 AbandonedMutexException。
  2. 修改函数,并且不再终止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相关推荐

  1. golang sync.Mutex 互斥锁 使用实例

    实例: var mutex sync.Mutex //互斥锁 func printer(str string){mutex.Lock() //加锁defer mutex.Unlock() //解锁fo ...

  2. Linux系统编程:使用mutex互斥锁和条件变量实现多个生成者和消费者模型

    实现代码 如题,使用mutex互斥锁和条件变量实现多个生成者和消费者模型. 直接上代码,需要线程中的互斥锁和条件变量的相关知识进行支撑.这里就不细说了呀,代码中有一定的注释. #include < ...

  3. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...

  4. golang mutex互斥锁分析

    互斥锁:没有读锁写锁之分,同一时刻,只能有一个gorutine获取一把锁 数据结构设计: type Mutex struct {state int32 // 将一个32位整数拆分为 当前阻塞的goro ...

  5. linux之mutex(互斥锁)

    在Posix Thread中定义有一套专门用于线程同步的mutex函数 1. 创建和销毁 有两种方法创建互斥锁,静态方式和动态方式.POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZ ...

  6. golang 1.10 mutex互斥锁源码

    Mutex锁分为normal模式和starvation模式.一开始默认处于normal模式.在normal模式中,每个新加入竞争锁行列的协程都会直接参与到锁的竞争当中来,而处于starvation模式 ...

  7. MySQL mutex互斥锁

    在事务机制中,锁机制是为了保证高并发,数据一致性的重要实现方式.MySQL除了Innodb引擎层面的行锁,还有latch锁.latch锁的作用资源协调处理.包含表句柄,线程,cpu线程,内存池等.其保 ...

  8. Go sync.Mutex互斥锁的学习

    1. 前言 1.1 基础回顾 原子操作:指那些不能够被打断的操作被称为原子操作,当有一个CPU在访问这块内容addr时,其他CPU就不能访问. CAS:比较及交换,其实也属于原子操作,但它是非阻塞的, ...

  9. Linux系统编程37:多线程之什么是临界区和临界资源以及如何使用mutex互斥锁

    文章目录 (1)临界区,临界资源和原子性问题 (2)互斥量(锁) A:互斥锁 B:锁的作用 C:互斥锁实现的原理 (3)可重入函数和线程安全 A:可重入函数和线程安全 B:常见的线程安全和不安全情况 ...

最新文章

  1. jquery模拟LCD 时钟
  2. Linux中设置vi编辑器的编码格式以及使用
  3. 用ssh远程登录服务器时,怎么直接以root用户登录?(需要修改配置,如果不想修改,可以先用普通用户登录再su切换到root用户)
  4. 微服务网关Ocelot
  5. 分表后需要注意的二三事
  6. mybatisplus 结果_MyBatis Plus 将查询结果封装到指定实体
  7. zemax双胶合消色差透镜设计
  8. 看电影学英语是学习口语的最佳方式
  9. CAD打印线条太粗、线条颜色设置
  10. 网络流量分析/网络流量监测
  11. 《初级会计实务》考试学习分享之第八章 ——政府会计基础【考试大纲】
  12. Android SAX解析远程服务器端的xml,防止解析的时候出现空格或者标点符号再次解析的方法
  13. podcast什么意思php,什么是podcast?
  14. leetcode日记
  15. C盘爆满怎么办?C盘没有空间了怎么办?九种方法释放C盘空间
  16. synchronized各种使用场景
  17. matlab 变压器 漏感,中频变压器漏感参数解析计算方法.doc
  18. System32和SysWOW64
  19. IGARSS2019-项目实战总结-keras
  20. c语言分治法求众数重数_分治算法:求众数及其重数

热门文章

  1. [童趣]搞笑幼儿经典语录
  2. 中华老字号“桂发祥“,走上了“狗不理“的老路?
  3. RabbitMQ-fanout广播模式
  4. 在这里给大家安利一个好的免费的虚拟主机云服务器使用地址
  5. HEC-HMS和HEC-RAS快速入门、防洪评价报告编制及洪水建模、洪水危险性评价等应用
  6. 查重合并mysql语句_查重、替换、2个表格合并
  7. 基于asp.net739办公自动化OA系统
  8. 推荐一款好用的数据安全工具
  9. 调节e18-d80nk的测量距离_水准仪、经纬仪、全站仪以及GPS测量使用教程,操作就是这么简单...
  10. 虚拟机red hat linux下载,Red Hat Enterprise Linux 官方正式版镜像下载