|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么?几年前,EricLippert注重到依据一样源代码举行优化构建和非优化构建会招致分歧的潜伏逝世锁。这个成绩会在C#4.0中被“修复”。“修复”放在引号傍边,是由于办理体例也有它本人的成绩。
最后的成绩大概来自于编译器在把IL转化为呆板代码的时分,依据你是不是翻开或封闭优化器和调试器,以非分歧的举动拔出了no-op指令。Lippert提道:回忆一下,lock(obj){body}实践上就是上面代码的语法:[quote]vartemp=obj;
Monitor.Enter(temp);
try{body}
finally{Monitor.Exit(temp);} 这里的成绩是,假如编译器在Monitor.Enter和受try回护的地区之间天生了no-op指令,那末运转时就有大概在Monitor.Enter以后和try之前抛出线程停止非常。在如许的情况下,finally不会实行,那末也就发生了程序锁泄露,程序有大概呈现逝世锁。假如在非优化和优化构建中不存在差别,就不存在这个成绩。
[/quote]不外。这个办理计划[译注:C#4.0是将Monitor.Enter()移进到try子句中,并在Enter的时分会传送一个援用值,标识锁是不是被占用。在finnally子句中,会起首判别锁是不是被占用,假如被占用,则开释锁。]也有它本人的成绩。据Eric说,“坚持分歧与纷歧致比拟,完整就是龟笑鳖无尾。它仍旧存在很年夜的问题...如许天生的代码所[译注:天生的代码是指编译器将lock转换为IL,实践上就相称于利用Monitor的语法]隐含的意义就是以为逝世锁程序是大概产生的最糟的事变。这类说法一定正确。”
锁的目标是为了回护可变资本,大概换句话说,是为了不可变资本的多个潜伏用户会见资本已被损坏的版本。4.0版本的现有办理计划并没有包括回滚到原始形态的功效,也没有包管可变资本的完全性。强行进进lock语句的finally子句、开释锁和同意会见恣意守候线程(该线程占用了已被损坏的资本),都有大概激发非常。这一办理计划在了局的分歧性、下降逝世锁的大概性和对会见被损坏形态大概支付的价值方面,做出了折衷。该成绩特别在多线程编程中会存在风险。
这个特定的折中是对两种糟了局的选择:程序逝世锁,仍是不再回护主要资本的形态。所谓“两害相权取其轻”,当我们举行多线程编程时,就必需在多个计划决议与衡量中做出一个选择。
这篇文章反应强烈热闹,一些开辟职员以为这类计划成绩不但限于多线程,在“平安锁”和“平安非常”之间也存在分歧的地方。Lippert也批准多线程只会让难处置的成绩更难,“正确取得锁仅仅是万里长征的第一步”,你的计划还必要思索其他各类非常,和在非常产生后怎样处置它们。大批的复兴者指出停止线程的伤害性,并部分批准Lippert所说的“停止非常地道就是找逝世”。
检察英文原文:C#4.0"Fixes"DeadlockIssue
来自:http://www.infoq.com/cn/news/2009/03/CSharpDeadlockFixed另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 |
|