程序人生

C++与C#,java,php,安卓开发,行业软件,软件测试
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用lock的常见错误

Posted on 2008-07-23 22:28  谢*勇  阅读(690)  评论(0编辑  收藏  举报

在C#程序中,为保证某段代码阻塞执行,如下:

func()

{

      lock(this)

     {

         //代码1....

         //代码2....

     }

}

当代码中发生异常的,如:

func()

{

      lock(this)

     {

         //代码1....

         //发生异常,将直接退出函数不执行后面的代码

        //代码2....

     }//实际这里隐含UnLock

}

这个时候,将导致lock发生混乱,下次代码执行到该处的时候,可能与预期不同.

安全的lock用法是在lock内增加try catch,保证隐含UnLock的执行,如下:

 

func()

{

      lock(this)

     {

         try

        {

            //代码1....

           //发生异常,将直接退出函数不执行后面的代码

           //代码2....

        }catch

        {

         }

     }//实际这里隐含UnLock

}

 

同理,其他的各种lock也应该相同处理,才能保证代码的正确执行.这个Bug非常隐秘,没有大量实际编程的程序员根本发现不了这个问题,笔者发现很多老手也没有注意出现此类错误.