前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Mutex 的正确打开方式

Mutex 的正确打开方式

作者头像
jgrass
发布2024-12-25 16:19:32
发布2024-12-25 16:19:32
7800
代码可运行
举报
文章被收录于专栏:蔻丁杂记蔻丁杂记
运行总次数:0
代码可运行

在使用 Mutex 在给线程/进程间加锁时,需要注意的问题。

1 AbandonedMutexException

在使用 mutex.WaitOne 时,可能抛出异常 AbandonedMutexException 。

  • 发生了什么?

有一个线程获得了锁,但没有释放锁,则会抛异常,此时数据的完整性可能被破坏。

具体解释见:AbandonedMutexException Class (System.Threading) | Microsoft Docs

比如:在 WaitOne 之后,进程直接退出,后台线程中的 mutex 可能就还没有释放。

  • 如何处理?

如果不关心这个异常,可以直接 catch ,继续进行接来下的操作即可。无需再次调用 WaitOne

代码语言:javascript
代码运行次数:0
复制
try{    try    {        mutex.WaitOne();    }    catch(AbandonedMutexException)    {        // 即使捕获到这个异常,此时也已经获得了锁    }
    // do something}finally{    mutex.ReleaseMutex();}
  • 其它内容

考虑如下场景,运行 run.exe 程序,里面获取了 mutex 锁,没有释放直接退出,再次打开 run.exe ,是不会有 AbandonedMutexException 异常的。 但如果同时运行两个(多个) run.exe 程序,第一个获取锁之后不释放直接退出,则第二个 run.exe 会捕捉到 AbandonedMutexException 异常。

原因(猜测):

在只有一个 run.exe 进程时,关闭之后,mutex 对应的内核对象随之释放,第二次运行,新建一个全新的 mutex 内核对象;

而当有两个(多个)run.exe 进程时,mutex 对象始终只有一个。

2 System.ApplicationException

当 WaitOne 对应的 ReleaseMutex 不在同一线程时,会抛出异常:System.ApplicationException:“从不同步的代码块中调用了对象同步方法。”

  • 当出现 ApplicationException 异常时,锁被释放了吗? 没有。只有当调用 WaitOne 的线程被回收之后,才会释放锁,并且下一个 WaitOne 会捕获 AbandonedMutexException 异常。
  • 如何避免 在 WaitOne 和 ReleaseMutex 之间不要插入 async/await 方法,否则可能带来线程切换。 在 UI 线程调用 WaitOne 和 ReleaseMutex ,之间倒是可以插入 async/await 方法,最后还是会回到 UI 线程,但是,这样 WaitOne 就是在 UI 线程等啊,卡 UI 啊。

3 关于 WaitOne 与 ReleaseMutex 的次数

  • WaitOne 多少次,就要 ReleaseMutex 多少次。
  • WaitOne 1 次, ReleaseMutex 多次会怎么样? 如果下一个 WaitOne 还没有被调用, ReleaseMutex 多次与一次的效果是一样的,如果有多个 WaitOne 在等待,那 ReleaseMutex 可能会帮其它的 WaitOne 释放锁,具体会不会真的释放,得看时机和运气。

更多内容,可以参阅: .NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv

原文链接: https://cloud.tencent.com/developer/article/2481473

本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年1月4日 |,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 AbandonedMutexException
  • 2 System.ApplicationException
  • 3 关于 WaitOne 与 ReleaseMutex 的次数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档