zoukankan      html  css  js  c++  java
  • "监视器(Monitor)与可靠性" 异步异常的影响 不及格的程序员

    作者:不及格的程序员-八神

    必备知识

       同步异常:指产生异常时,是我们预想到的,可以定义捕获的.

       异步异常:指代码中不可预料的异常,比如 ThreadAbortException、StackOverflowException 和 OutOfMemoryException 异常.   

       在CLR中的异步异常,有独特的异常码,例如 Access Violation异常码是 0xC0000005, divide by zero (integer)异常码是0xC0000094, divide by zero (floating)异常码是0xC000008E. 它们被CLR特别处理. 
       CLR中的同步异常就是指Throw抛出的异常对象,而它给RaiseException 的异常码为0xE0434F4D,这代表为托管异常.CLR会以SEH机制向系统注册异常处理函数来处理这些异常.

    正文

       原子操作与异步异常:.NET下的异步异常 ThreadAbortException,通过另一个委托线程(而不是在线程本身,那样只会产生同步异常)停止(调用Abort方法)当前线程时就会发生,它可以中断当前线程中正被执行的任何代码.

       这样就会产生问题,如果我们正在同步锁定一个对象,而又碰巧发生线程中止异常,那么被锁定对象将得不到释放。

      下面用简单的代码说明这种情况的发生,虽然几呼不可能.

     1 using System;
     2 namespace TempWebApplication1
     3 {
     4     public partial class Test : System.Web.UI.Page
     5     {
     6         private object sync = new object();
     7 
     8         protected void Page_Load(object sender, EventArgs e)
     9         {
    10             //lock生成的代码与下面是相同的
    11             System.Threading.Monitor.Enter(sync);
    12             doSomething()//理论上这里不应该有代码,但是在调试模试下,JIT会生成NOP汇编指令,这样这里会可能会被ThreadAbortException中断(几率非常小,但是你要知道这个原理),而finally则不会执行.
    13             try
    14             {
    15                 Response.Write("abc");
    16             }
    17             finally
    18             {
    19                 System.Threading.Monitor.Exit(sync);
    20             }
    21         }
    22     }
    23 } 

    下面是调试版本的汇编节选,可以看到nop指令的.

    System.Threading.Monitor.Enter(sync);
      mov         eax,dword ptr [ebp-3Ch] 
      
    mov         ecx,dword ptr [eax+00000174h] 
      
    call        726C216D 
      
    nop              
    try
    {
      
    nop              
    Response.Write(
    "abc");
      ...

    南来地,北往的,上班的,下岗的,走过路过不要错过!

    ======================个性签名=====================

    之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?

    下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!

    如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.

    我的开发工具

    对于博客园里的网友,不敢称为叫"程序员"的人,你们攻击性太强,看来你们是不会想到我的用意的.园子里有不少人都非常喜欢Jeffrey,是因为它的第一版 框架设计 CLR via C#.
    可是从第一版到现在的第三版,没有看到真正底层的东西,内容仅仅是比MSDN文档更丰富一些,可能是我的要求太高了吧.
    也就是因为它很多时候会接触到微软开发人员,会经常聊聊某些问题而已,而它又将这些问题反应到书中.也许它就像一个小记者.
    它的年龄大我们不多,我的孩子与它小儿子一般大,如果我能向它那样出入微软与它们开发人员长时间交流,不仅仅会牛成它这样.....
    可是微软的开发人员不会扔太多时间在它这儿的.所以它会整天追着这个,赶它那个..屁颠个不停吧...
    而它的另一版被称为好书的 Windows核心编程,更是没有什么深度可言,仅仅是将windows提供的api,以及内核功能再重申了一遍.
    这些书对晋及编程知识是有些贡献的,再说一遍我不是在匾低谁,说说想法而已.

  • 相关阅读:
    通过SSH隧道的本地转发实现Django连接远程数据库
    Mysql多数据库备份
    apollo 项目配置中心开源框架部署
    nginx 配置多个 https 域名访问
    beetl 模板语法
    异常:由 spring-session pom 引发
    异常:NoSuchFieldError: BEST_MATCHING_HANDLER_ATTRIBUTE
    【Redis__验证】手机验证和限制登录功能
    【Linux__环境】配置
    【Layui__上传】多图上传
  • 原文地址:https://www.cnblogs.com/ioriwellings/p/1734664.html
Copyright © 2011-2022 走看看