跟涛哥一起学嵌入式11:一个实现锁机制非常有意思的宏
发布日期:2021-06-29 04:23:48
浏览次数:2
分类:技术文章
本文共 672 字,大约阅读时间需要 2 分钟。
QQ群(宅学部落)有位学员问了一个很奇怪的宏,觉得很有意思,特拿来分享,它的定义如下:
我们知道,宏定义其实就是为了方便,给一串代码字符串定义一个别名。有时候字符串过于复杂,我们可以分多行书写,然后使用逻辑连接符“\”连接起来,表示一个完整的字符串。但是分析上面的宏定义,你会发现它分别定义了2个宏,但是呢,又使用了一对大括号括起来,很有欺骗性:看起来很像语句表达式,但是呢,有没有小括号括起来,是不是很奇怪?调用的时候,使用方法更是奇怪,如果我们单独使用AA()或BB()调用,你会发现编译根本通不过,这是为什么呢?我们可以使用命令对上面的程序作预处理展开:$ gcc -E main.c预处理器对宏定义展开后,你会发现,会报语法错误,但是我们通过AA();BB();这种调用方式呢,就可以避免语法错误,可以顺利编译通过并运行。这两个有意思的宏,要成对出现,才能避免程序编译错误,如果你只使用了其中一个,程序就编译通不过,彻底歇菜了。这是谁写的代码啊?为什么要这么写?其实正是这对宏的有意思之处,我们可以稍作封装:
通过上面的修改,你会发现这对宏变成了一对加锁加锁功能,可以实现原子操作的临界区功能。而且更巧妙的是这对宏利用了C语法编译检查,强制程序员成对使用,否则就会报语法编译错误。因此,这种强制成对使用,也就避免了加锁解锁不成对出现时引起的死锁问题。C语言博大精深,任何一段代码仔细分析,仔细推敲,都有很多编程技巧和精华在里面,感觉该学员提出的一个好问题,也欢迎更多的学员遇到问题踊跃提问、勤于思考,大家一起学习、努力、进步。
转载地址:https://blog.csdn.net/zhaixuebuluo/article/details/104028950 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月01日 17时19分59秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
联诚支付: 市场频现不安信号超级周恐再现大行情!
2019-04-29
使用具有信任证明的区块链技术进行跨境支付(来自联诚支付)
2019-04-29
联诚支付:如何将区块链技术集成到您的项目中
2019-04-29
联诚支付—区块链+跨境支付有哪些优势
2019-04-29
联诚支付:为什么要说区块链技术对业务很重要
2019-04-29
联诚支付,能更使用具有信任证明的区块链技术进行跨境支付
2019-04-29
联诚支付:加密货币和区块链改变企业家精神的6种方式
2019-04-29
联诚支付:区块链如何改变我们的支付方式
2019-04-29
联诚支付,支付渠道和方式的发展
2019-04-29
那么区块链和数字货币直接有什么关系呢
2019-04-29
USDT场外交易平台优势有哪些呢?有哪些特点?资金安全怎么保证?
2019-04-29
联诚支付搬砖Q&A
2019-04-29
搬砖经验分享
2019-04-29
搬砖需要很高的启动资金吗?
2019-04-29
刚开始搬砖选择主流币还是小币种?
2019-04-29
联诚场外交易平台,为什么使用USDT作为支付?
2019-04-29
联诚场外交易平台,说说USDT的优势和作用
2019-04-29
币圈里如何利用USDT搬砖
2019-04-29
扒一扒在联诚支付搬砖的那些底
2019-04-29
USDT 转账收款的常见问题
2019-04-29