美文网首页
避免遗忘UNLOCK的小技巧

避免遗忘UNLOCK的小技巧

作者: glinuxer | 来源:发表于2018-05-03 21:52 被阅读0次

    这是个人微信公众号LinuxerPub发布的文章


    C++程序可以通过封装来实现RAII,从而避免一切资源泄漏,包括忘记unlock。当时就为了这点,我就特别想推动用C++写C代码,C++只做封装,其它逻辑还是使用C编写。这样对于大部分程序员来说,基本上就没有学习C++的成本,同时还可以享受到高级语言的便利。真希望早日可以尝试这个实践 —— 去年底已经要求本厂的C语言程序员,学习一点C++概念,并开始进行本厂C++底层库的封装实现。

            如果条件限定只能使用C语言,就要按照一些原则和技巧编写代码,避免遗忘unlock。先介绍几个原则:

     函数尽量一个出口,即一个return。这样可以保证退出的代码和逻辑是唯一的,既不易出错,也便于维护。为了实现这一目的,有时候goto是必不可少的。goto用于error handler,是极其适合的。

     写完lock,立刻写unlock,然后再在中间写其它逻辑代码;如果需要持锁返回,则函数名称要有明显的提示;

    如果涉及多个锁,始终按照一个顺序上锁,解锁。如果可能的话,封装一个函数用于给多个锁上锁,解锁;

    除了以上的原则,今天介绍一个C编码的小技巧,可以在函数内部防止遗漏unlock。以mutex互斥锁为例,进行下面代码的封装。

    经过这样的封装,就要求LOCK和UNLOCK必须是成对使用,一旦遗漏或者用错一个,就会在编译阶段报错。

    请看下面的示例程序:

    如果没有忘了写PTHREAD_MUTEX_UNLOCK或者错写成LOCK了,在编译阶段就会报错,错误信息显示少了一个'}'符号。

    今天的小技巧介绍完毕。如果我个人没记错的话,我已经有好几年没有写出带有死锁,内存泄漏的代码了,无论是C还是C++。

    相关文章

      网友评论

          本文标题:避免遗忘UNLOCK的小技巧

          本文链接:https://www.haomeiwen.com/subject/sozlrftx.html