首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >避免遗忘UNLOCK的小技巧

避免遗忘UNLOCK的小技巧

作者头像
glinuxer
发布2019-04-10 15:08:41
5300
发布2019-04-10 15:08:41
举报
文章被收录于专栏:专注网络研发专注网络研发

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

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

  1. 函数尽量一个出口,即一个return。这样可以保证退出的代码和逻辑是唯一的,既不易出错,也便于维护。为了实现这一目的,有时候goto是必不可少的。goto用于error handler,是极其适合的。
  2. 写完lock,立刻写unlock,然后再在中间写其它逻辑代码;如果需要持锁返回,则函数名称要有明显的提示;
  3. 如果涉及多个锁,始终按照一个顺序上锁,解锁。如果可能的话,封装一个函数用于给多个锁上锁,解锁;

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

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

请看下面的示例程序:

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

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

PS:不知道公众号什么时候能够让我有留言功能,不然都不方便和大家一起讨论问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LinuxerPub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档