跟涛哥一起学嵌入式第11集:一个实现锁机制非常有意思的宏

QQ群(宅学部落)有位学员问了一个很奇怪的宏,觉得很有意思,特拿来分享,它的定义如下:

我们知道,宏定义其实就是为了方便,给一串代码字符串定义一个别名。有时候字符串过于复杂,我们可以分多行书写,然后使用逻辑连接符“\”连接起来,表示一个完整的字符串。但是分析上面的宏定义,你会发现它分别定义了2个宏,但是呢,又使用了一对大括号括起来,很有欺骗性:看起来很像语句表达式,但是呢,有没有小括号括起来,是不是很奇怪?
调用的时候,使用方法更是奇怪,如果我们单独使用AA()或BB()调用,你会发现编译根本通不过,这是为什么呢?我们可以使用命令对上面的程序作预处理展开:
$ gcc -E main.c
预处理器对宏定义展开后,你会发现,会报语法错误,但是我们通过AA();BB();这种调用方式呢,就可以避免语法错误,可以顺利编译通过并运行。
这两个有意思的宏,要成对出现,才能避免程序编译错误,如果你只使用了其中一个,程序就编译通不过,彻底歇菜了。这是谁写的代码啊?为什么要这么写?其实正是这对宏的有意思之处,我们可以稍作封装:

通过上面的修改,你会发现这对宏变成了一对加锁加锁功能,可以实现原子操作的临界区功能。而且更巧妙的是这对宏利用了C语法编译检查,强制程序员成对使用,否则就会报语法编译错误。因此,这种强制成对使用,也就避免了加锁解锁不成对出现时引起的死锁问题。
C语言博大精深,任何一段代码仔细分析,仔细推敲,都有很多编程技巧和精华在里面,感觉该学员提出的一个好问题,也欢迎更多的学员遇到问题踊跃提问、勤于思考,大家一起学习、努力、进步。

原文地址:http://blog.51cto.com/zhaixue/2318218

时间: 2024-10-12 07:07:54

跟涛哥一起学嵌入式第11集:一个实现锁机制非常有意思的宏的相关文章

跟涛哥一起学嵌入式 -- 第01集:say you say me

大家好,此时此刻,2018俄罗斯世界杯已暂告一段落,16强已经产生,卫冕冠军德国队提早回家,阿根廷起死回生,C罗一个30多高龄的年纪,还在坚持健身,一身腱子肉,在球场上挥洒青春,演绎着帽子戏法,给观众带来一场场精彩的视觉盛宴.世界杯的最大魅力之处也许就在于其不确定性. 在这足球之夜,<跟涛哥一起学嵌入式>专栏也开始了,关于嵌入式学习.路线.就业.面试相关的问题,我会坚持一点一点地写下去.C罗,一个85后,跟我差不多的年龄,还坚持健身,还这么拼命,我们还有什么理由给自己的不坚持开脱呢? 为什么写

跟涛哥一起学嵌入式 第02集:工作还是考研?

大家好,我是涛哥,今天我们聊聊第一个话题:工作还是考研. 工作与考研,是每个大三大四学生都要去纠结一下的问题,也是一个很难做抉择的话题.对自己的现状不满意,蹉跎了岁月,感觉自己学得不够多,没学到什么技能:对自己能否找到工作.自己能否胜任未来的工作没有自信:高考失利,进了一所非211/985大学,在大学浑浑噩噩已经混了一半时间了,每天吃鸡推搭.小玛利亚,不想再这样颓废下去,想通过考研改变自己.这些都会滋生你考研的念头,希望通过研究生能改变自己.提高自己. 不仅在校学生.工作1~2年后的职场新兵,也

跟涛哥一起学嵌入式 第03集:嵌入式要从u-boot移植学起?

大家好,我是涛哥,欢迎阅读<跟涛哥一起学嵌入式>第3集.俄罗斯仲夏夜,世界杯依旧如火如萘.球场上,夕阳下,梅西没落的身影.C罗的黯淡离场,并没有打击大家太多的热情.战火依旧,老兵不死,梅罗时代是否快要终结?然而新一代巨星冉冉升起,风起云涌.在看球的同时,学习充电也不能落下,今天我们聊聊第3个话题:学习嵌入式,一定要从u-boot移植学起吗? 嵌入式真要从U-boot移植学起? 故事缘起嵌入式技术群(475504428)一位嵌入式学员遇到的问题:这位学员想在他的开发板上移植最新版本的U-boot

跟涛哥一起学嵌入式 第04集:一道面试题,测出你的C语言功底

大家好,我是涛哥,欢迎阅读<跟涛哥一起学嵌入式>第04集,今天聊聊面试题. 嵌入式C语言面试题中,大家经常会看到宏定义的考题.比如:定义一个宏,求两个数中的最大数.别小看这个考题,虽然简单,但是它却陷阱不断,时刻在考验着你的C语言编程功底!根据你的答案,面试官对你的印象肯定不一样.那下面我们看看各个不同版本的答案吧. 合格 对于学过C语言的同学,写出这个宏基本上不是什么难事,使用条件运算符就能完成: #define MAX(x,y) x > y ? x : y 这是最基本的C语言语法,如

跟涛哥一起学嵌入式 第05集:一道程序改错题,测出你的嵌入式功底

大家好,欢迎阅读<跟涛哥一起学嵌入式>第05集,我们今天讨论一下中断的基本概念. 中断,是嵌入式开发中经常使用的一个功能,也是嵌入式工程师必须要掌握的一个概念:CPU和外设通信时,一般都采用中断的形式异步通信,可以大大提高CPU资源的利用率.而你对中断的理解,到底有多少呢?不要急,一道程序改错题,就可以测出你的嵌入式系统功底. 比如,我们在嵌入式ARM裸机平台上,要实现一个MP3播放器,要求实现如下功能:当按键按下时,可以播放.暂停.播放下一首.上一首.为此,我们设计一个按键中断服务程序,当有

[转] 嵌入式入门学习法(写给惠州学院电子系学嵌入式的同学们)

我是08届惠州学院电子系的毕业生,现在从事于linux嵌入式研发工作.本人写这一篇所谓的“嵌入式入门学习法”,是因为自己一开始学习嵌入式的时候,电子系里几乎没有人可以带自己入门或者教授相关学习方法,基本上都是自己摸索着学习,可想而知,这过程蛋疼的程度让人想死.所以希望通过这一年来自己的学习,整理出一条学习路线给以后电子系的师弟们作参考. 废话不多说,进入正题.首先大家应该理解两个概念,什么是处理器,什么是控制器.相信很多电子系的学生,一开始是从玩51单片机开始进入电子研发领域的,再者就是AVR单

【涛哥带你看DC】江西测绘双活数据中心

2014年3月10日,江西省地理信息公共服务平台(政务版)正式上线运行.在半年之后的10月15日,涛哥来到江西省测绘地理信息局仔细了解支持此公共服务平台的后台数据中心的情况. 江西省测绘地理信息局今年8月才搬的家,新办公大楼位于南昌一处偏僻的地方(周围都在建商品房,估计很快也会热闹起来).大楼很气派,但看了内部就知道,很多地方还没有最后完工.新机房也建在这幢大楼里,与旧办公楼的机房构成了相距10多公里的"双活数据中心". 据江西省测绘地理信息局网络中心的负责人介绍,当初在数据中心的建设

涛哥的Python脚本工具箱之批量替换目录所有指定扩展名的文件中的指定字符串

今天发布刚完成的涛哥的Python脚本工具箱之批量替换目录所有指定扩展名的文件中的指定字符串,命令行参数处理改用目前比较好用的argparse库,Python代码如下: #!/usr/bin/python2.7 # -*- encoding: UTF-8 -*- # Copyright 2014 [email protected] """replace old string with new string from all files in path 批量替换目录所有指定扩展

学嵌入式开发好吗

学嵌入式开发好吗 嵌入式系统可以说是当前最热门最有发展前途的IT应用领域之一,嵌入式系统通常会用到在一些特定的专用设备上,特别是随着消费家电的智能化,嵌入式更显重要, 对于刚毕业的学生来讲,投身于一个嵌入式开发职业行业里注定是一个漫长的过程,只要你潜心修炼一定可以成为一名优秀的嵌入式工程师,目前华清远见星创客的应届毕业生,月薪都达到了1w+,那么学嵌入式开发哪里好,下面来一一列举嵌入式的好处: 1.目前国内外这方面的人是很稀缺的.一方面,是因为这一领域入门门槛较高,不仅要懂底层软件,而且必须懂得