写点什么

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:522395
用户头像

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

关注

评论

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

基于昇腾用PyTorch实现CTR模型DIN(Deep interest Netwok)网络

永荣带你玩转昇腾

VR游戏的开发框架

北京木奇移动技术有限公司

VR开发 软件外包公司 VR技术

AI智能体策略FunctionCalling和ReAct有什么区别?

王磊

局域网沟通软件,私有化内网沟通工具-支持国产芯片与系统

BeeWorks

即时通讯 IM

BOE(京东方)第6代新型半导体显示器件生产线全面量产 打造全球显示产业新引擎

爱极客侠

7 款最佳数据集成平台推荐

NocoBase

开源 低代码 ETL 数据集成平台 数据模型驱动

PyTorch 实现 Alexnet图像分类

永荣带你玩转昇腾

IM即时通讯软件,BeeWorks的产品优势有哪些?

BeeWorks

即时通讯 IM 企业级应用

BOE(京东方)第6代新型半导体显示器件生产线全面量产 打造全球显示产业新引擎

科技热闻

昇腾910-PyTorch 实现 ResNet50图像分类

永荣带你玩转昇腾

阅读源码的思路

Nick

开源 软件工程 经验之谈

HarmonyOS基础组件:Button三种类型的使用

IT小码哥

鸿蒙 鸿蒙 Ability an'droid HarmonyOS NEXT

鸿蒙仓颉开发语言实战教程:自定义组件

幽蓝计划

HarmonyOS实战:路由跳转踩坑记

IT小码哥

HarmonyOS 鸿蒙 Ability an'droid harmony HarmonyOS NEXT

HarmonyOS实战:实现任意拖动的应用悬浮窗口

IT小码哥

鸿蒙 Ability Open Harmony an'droid harmony harmoyos

跨端生态重构×AI智能驱动:移动研发模式新纪元

xuyinyin

VR游戏的线上运维

北京木奇移动技术有限公司

软件外包公司 VR技术 VR游戏

局域网沟通工具,企业内网即时通讯app推荐!

BeeWorks

即时通讯 企业级应用

“深时数字地球”国际大科学计划系列工作坊持续开放!专业友好可复现,赋能科学智能生态合作(4)

ModelWhale

科学智能 DDE 深时数字地球 AI4S

PyTorch 实现MobileNetV1用于图像分类

永荣带你玩转昇腾

企业im怎么选? BeeWorks -安全的企业内部通讯软件

BeeWorks

即时通讯 IM

HarmonyOS实战:组件化项目搭建

IT小码哥

鸿蒙 Ability an'droid haromny HarmonyOS NEXT

昇腾910-PyTorch实现传统CTR模型WideDeep网络

永荣带你玩转昇腾

PyTorch 实现GoogleNet用于图像分类

永荣带你玩转昇腾

VR游戏开发的主要流程

北京木奇移动技术有限公司

软件外包公司 VR技术 VR游戏

DevEcoStudio 中使用模拟器时如何过滤日志

飞龙AI

鸿蒙核心技术 鸿蒙开发者工具 DevEcoStudio

「DeepSeek 技术解析」:LLM 训练中的强化学习算法

Baihai IDP

AI 强化学习 DeepSeek

HarmonyOS实战:首页多弹窗顺序弹出终极解决方案

IT小码哥

HarmonyOS an'droid harmony 鸿蒙 os

NPU适配推荐系统GR模型流程

永荣带你玩转昇腾

VR游戏的上线流程

北京木奇移动技术有限公司

VR开发 软件外包公司 VR技术

VR游戏的上线运营

北京木奇移动技术有限公司

软件外包公司 VR游戏 VR技术开发

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