这是个人微信公众号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++。
网友评论