【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

C# 4.0“修复了”死锁问题

  • 2009-03-22
  • 本文字数:1085 字

    阅读完需:约 4 分钟

几年前,Eric Lippert 注意到根据同样源代码进行优化构建和非优化构建会导致不同的潜在死锁。这个问题会在 C# 4.0 中被“修复”。“修复”放在引号当中,是因为解决方式也有它自己的问题。

最初的问题可能来自于编译器在把 IL 转化为机器代码的时候,根据你是否打开或关闭优化器和调试器,以非一致的行为插入了 no-op 指令。Lippert 提道:

回想一下,lock(obj){body}实际上就是下面代码的语法:> var temp = obj;

Monitor.Enter(temp);
try { body }
finally { Monitor.Exit(temp); }

这里的问题是,如果编译器在 Monitor.Enter 和受 try 保护的区域之间生成了 no-op 指令,那么运行时就有可能 在 Monitor.Enter 之后和 try 之前抛出线程终止异常。在这样的情形下,finally 不会执行,那么也就产生了程序锁泄漏,程序有可能出现死 锁。如果在非优化和优化构建中不存在差异,就不存在这个问题。

不过。这个解决方案 [译注:C# 4.0 是将 Monitor.Enter() 移入到 try 子句中,并在 Enter 的时候会传递一个引用值,标识锁是否被占用。在 finnally 子句中,会首先判断锁是否被占用,如果被占用,则释放锁。] 也有它自己的问题。据 Eric 说,“保持一致与不一致相比,完全就是五十步笑百步。它仍然存在很大的问 题…这样生成的代码所 [译注:生成的代码是指编译器将 lock 转换为 IL,实际上就相当于使用 Monitor 的语法] 隐含的意义就是认为死锁程序是可能 发生的最糟糕的事情。这种说法未必准确。”

锁的目的是为了保护可变资源,或者换句话说,是为了避免可变资源的多个潜在用户访问资源已被破坏的版本。4.0 版本的现有解决方案并没有包含回滚到原始状态的功能,也没有保证可变资源的完整性。强行进入 lock 语句的 finally 子句、释放锁以及允许访问任意等待 线程(该线程占用了已被破坏的资源),都有可能引发异常。这一解决方案在结果的一致性、降低死锁的可能性和对访问被破坏状态可能付出的代价方面,做出了折 衷。该问题尤其在多线程编程中会存在风险。

这个特定的折衷是对两种糟糕结果的选择:程序死锁,还是不再保护重要资源的状态。所谓“两害相权取其轻”,当我们进行多线程编程时,就必须在多个设计决策与权衡中做出一个选择。

这篇文章反响热烈, 一些开发人员认为这类设计问题不只限于多线程,在“安全锁”和“安全异常”之间也存在不同之处。Lippert 也同意多线程只会让难处理的问题更难,“正 确获得锁仅仅是万里长征的第一步”,你的设计还需要考虑其他各种异常,以及在异常发生后如何处理它们。大量的回复者指出终止线程的危险性,并部分同意 Lippert 所说的“终止异常纯粹就是找死”。

查看英文原文: C# 4.0 “Fixes” Deadlock Issue

2009-03-22 21:522033
用户头像

发布了 254 篇内容, 共 53.4 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

大咖说·开源人说|数据库 PolarDB 开源的商业逻辑与价值思考

大咖说

数据库 阿里云 开源

Celestia 简介:重新构想的区块链

devpoint

区块链 以太坊 12月月更 Celestia

专访实在智能孙林君:颠覆传统RPA的实在IPA模式如何做到真正人人可用

王吉伟频道

RPA 机器人流程自动化 实在智能 实在IPA模式 RPA人人可用

专利解析|数据中台—数据流配置弹框交互优化方法

元年技术洞察

数据中台 数字化转型 专利解析

阿里云视觉智能开放平台——人脸活体检测算法重磅升级

夏夜许游

服务升级 人脸活体检测 人脸人体

智能合约DAPP开发WEB3.0系统搭建技术

薇電13242772558

智能合约

直播|HashData信创概览

酷克数据HashData

信创

自动化测试技术笔记(二):准备工作的切入点

老张

自动化测试

汽车之家基于 Milvus 的向量检索平台实践

Zilliz

数据库 向量检索 Milvus

Amazon 4.7 星评,领域新经典,了解服务设计就读它

图灵社区

产品经理 设计模式 服务设计

隐匿于喧嚣城市的世外桃源,「武汉浮生艺术馆」开放小程序预约通道,顺利举办多场艺术展览

天天预约

小程序 SaaS 预约工具 展览 艺术馆

我对管理角色带团队的一些经验分享

软件工程师-罗小东

重磅!TDengine 3.2.0 正式发布

TDengine

数据库 tdengine 时序数据库

我把传统业务架构升级到业务中台架构的心得

软件工程师-罗小东

传统企业DevOps基础设施架构规划之道

冯文辉

DevOps 华为云DevCloud 华为CodeArts

ZBC成功上线PancakeSwap的糖浆池,并有望在不久上线Binance

股市老人

“唤醒”大数据价值,敏捷数据开发成为企业数字化发展的法宝

数造万象

我对中台的理解和企业数字中台建设的思考

软件工程师-罗小东

软件测试培训 | 在霍格沃兹测试开发学社学习是种怎样的体验?

霍格沃兹测试开发学社

如何优化大场景实时渲染?HMS Core 3D Engine这么做

HMS Core

HMS Core

HTTP报文内容

穿过生命散发芬芳

HTTP 12月月更

【FAQ】申请Health Kit权限的常见问题及解答

HMS Core

HMS Core

ZBC成功上线PancakeSwap的糖浆池,并有望在不久上线Binance

EOSdreamer111

RayLink 远控软件又推出 2 个重磅宝藏功能免费用

RayLink远程工具

远程控制软件 远程办公软件 远控软件

RocketMQ Schema——让消息成为流动的结构化数据

Apache RocketMQ

RocketMQ

新华三推出人工智能模型训练平台,让智慧算力触手可及

脑极体

我把整个研发中台拆分过程的一些心得总结

软件工程师-罗小东

在新基建数字化的时代,寻找自我的突破和价值创造

软件工程师-罗小东

数据存储,消息队列的高可用保障

C++后台开发

数据库 数据结构 消息队列 后端开发 linux开发

小游戏流量变现都有哪些窍门?

FinFish

小游戏 微信小程序-游戏 小程序游戏 微信小游戏

Laravel中HasOne和BelongsTo的区别

ModStart

C# 4.0“修复了”死锁问题_.NET_David West_InfoQ精选文章