专栏首页专注网络研发避免遗忘UNLOCK的小技巧

避免遗忘UNLOCK的小技巧

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:不知道公众号什么时候能够让我有留言功能,不然都不方便和大家一起讨论问题。

本文分享自微信公众号 - LinuxerPub(LinuxerPub),作者:glinuxer

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一道腾讯面试题目:没有listen,能否建立TCP连接

    这个题目是之前在我的QQ群里一个同学在腾讯面试过程中被问到的。当时在群里做了简单的讨论,今天系统的把这个问题分析一遍。

    glinuxer
  • DPDK之PMD原理

    PMD是Poll Mode Driver的缩写,即基于用户态的轮询机制的驱动。本文将介绍PMD的基本原理。

    glinuxer
  • Linux内核那些事之连接跟踪

    连接跟踪(也叫会话管理)是状态防火墙关键核心,也是很多网元设备必不可少的一部分。各厂商的实现原理基本雷同,只是根据各自的业务进行修改和优化。其中,还有不少厂商干...

    glinuxer
  • keras系列︱Sequential与Model模型、keras基本结构功能(一)

    不得不说,这深度学习框架更新太快了尤其到了Keras2.0版本,快到Keras中文版好多都是错的,快到官方文档也有旧的没更新,前路坑太多。 到发文为止...

    素质
  • 炒币亏损1.2亿?一个90后女COO维权背后疑云重重

    比特币的价格开始断崖式的下跌,比特币暴跌引发的矿难也随之而来,不少矿场开始按斤来抛售矿机,有些甚至当废品来回收。

    晓枫说
  • 让TouchGFX在你的板子上跑起来

    本文档主要介绍,如何快速搭建起在STM32上运行的TouchGFX底层驱动和应用,以STM32H743为例。

    用户1605515
  • transformers模型上传和共享

    请在model_cards/文件夹下添加README.md到仓库中,其中model_cards/包括:模型描述,训练参数(数据集,预处理,超参数),评估结果,预...

    磐创AI
  • 超键、候选键和主键

    平凡的学生族
  • 一名旅游从业工作者,如何用数据分析出国庆旅游最受欢迎的旅游产品?

    中秋节一过,小伙伴心心念念盼望的十一黄金周终于快要到来,难得的七天长假,天气又这么好,哪怕知道各大景区国庆都会是人人人人众,也按耐不住躁动的心。

    CDA数据分析师
  • 数据源管理 | PostgreSQL环境整合,JSON类型应用

    PostgreSQL是一个功能强大的且开源关系型数据库系统,在网上PostgreSQL和MySQL一直有大量的对比分析。大多从性能,开源协议,SQL标准,开发难...

    知了一笑

扫码关注云+社区

领取腾讯云代金券