嵌入式linux中的鎖機制,跟濤哥一起學嵌入式第11集:一個實現鎖機制非常有意思的宏...

QQ群(宅學部落)有位學員問了一個很奇怪的宏,覺得很有意思,特拿來分享,它的定義如下:

e4be1228f1ebabece50ed41c339e800a.png

我們知道,宏定義其實就是為了方便,給一串代碼字符串定義一個別名。有時候字符串過于復雜,我們可以分多行書寫,然后使用邏輯連接符“\”連接起來,表示一個完整的字符串。但是分析上面的宏定義,你會發現它分別定義了2個宏,但是呢,又使用了一對大括號括起來,很有欺騙性:看起來很像語句表達式,但是呢,有沒有小括號括起來,是不是很奇怪?

調用的時候,使用方法更是奇怪,如果我們單獨使用AA()或BB()調用,你會發現編譯根本通不過,這是為什么呢?我們可以使用命令對上面的程序作預處理展開:

$ gcc -E main.c

預處理器對宏定義展開后,你會發現,會報語法錯誤,但是我們通過AA();BB();這種調用方式呢,就可以避免語法錯誤,可以順利編譯通過并運行。

這兩個有意思的宏,要成對出現,才能避免程序編譯錯誤,如果你只使用了其中一個,程序就編譯通不過,徹底歇菜了。這是誰寫的代碼啊?為什么要這么寫?其實正是這對宏的有意思之處,我們可以稍作封裝:

d5bcf87c51464e9467142956021cb12d.png

通過上面的修改,你會發現這對宏變成了一對加鎖加鎖功能,可以實現原子操作的臨界區功能。而且更巧妙的是這對宏利用了C語法編譯檢查,強制程序員成對使用,否則就會報語法編譯錯誤。因此,這種強制成對使用,也就避免了加鎖解鎖不成對出現時引起的死鎖問題。

C語言博大精深,任何一段代碼仔細分析,仔細推敲,都有很多編程技巧和精華在里面,感覺該學員提出的一個好問題,也歡迎更多的學員遇到問題踴躍提問、勤于思考,大家一起學習、努力、進步。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530253.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux 制作box文件夾,用busybox制作自己簡易的根文件系統

當使用Busybox-1.2.0制作根文件系統交叉編譯器為3.3.2make-3.8.1STEP 1:創建根文件系統目錄,主要包括以下目錄/bin,/etc,/dev,/mnt,/sbin,/usr。STEP 2:升級make到3.81版本&#xff…

linux主頻限制服務,linux抵御DDOS攻擊 通過iptables限制TCP連接和頻率

cc攻擊一到就有點兵臨城下的感覺,正確的設置防護規則可以做到臨危不亂,這里給出一個iptables對ip進行連接頻率和并發限制,限制單ip連接和頻率的設置規則的介紹#單個IP在60秒內只允許新建20個連接,這里假設web端口就是80,iptables -I INPUT -…

linux es數據庫 head,elasticsearch安裝es-sql插件

說明:本示例是在CentOs Linux7.4上運行,安裝的es版本為6.8.0,對應es-sql版本6.8.0,es-head版本5.0.0,需要安裝JDK下載es安裝包wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.0.tar.gz…

LINUX進程調度分析源碼,Linux 實時調度(源碼分析)

為了弄清楚在多cpu系統中是如何實現實時調度的,先引入以下幾個概念:cpu的狀態:我們知道,在linux系統中,任務的優先級為0~140。INVALID:(-1)該cpu不可用IDLE(0):140NORMAL(1):100~139對應于普通任務的優先級…

linux源碼文件名,Linux中文件名解析處理源碼分析

Linux中文件名解析處理源碼分析前言Linux中對一個文件進行操作的時候,一件很重要的事情是對文件名進行解析處理,并且找到對應文件的inode對象,然后創建表示文件的file對象。在此,對文件名解析過程,并且如何找到對應ino…

帝國cms linux偽靜態規則,帝國cms7.2偽靜態規則怎么寫

一、在linux主機下實現偽靜態確認虛擬主機是否支持rewrite偽靜態.htaccess文件。添加.htaccess 文件,把htaccess 文件放在網站根目錄。二、在win主機下實現偽靜態確認虛擬主機是否支持rewrite偽靜態httpd.ini文件。添加httpd.ini文件,把httpd.ini文件放入…

linux core 永久生效,【調試】Core Dump是什么?Linux下如何正確永久開啟?

內容簡介【調試】Core Dump是什么?Linux下如何正確永久開啟?Core Dump是什么?Linux下如何正確永久開啟?Core Dump是什么?Core Dump乍聽之下很抽象。當程序運行的過程中異常終止或崩潰,操作系統會將程序當時…

linux故障排查書籍,Linux系統故障排查和修復技巧.docx

fsck -y /cievZhdab(fsck為文件系統檢測修復命令,“-y”設定檢測到錯誤自動修復,Zdev/hda6 為發生錯誤的硬盤分區,請依據具體情況更改此參數) 系統修復完成后,用命令“reboot,重新啟動即可? 案例三、GRUB選項設置錯誤…

用于用戶C語言標識符,下列可用于C語言用戶標識符的一組是( )

摘要:下列不屬于骨肉瘤患者常見護理問題()于C語言用戶組Since people send nonverbal signals through multiple channels simultaneously, it is impossible to increase our nonverbal communication competence by becoming more aware of how it operates in sp…

c語言編程常見問題解答,C語言編程常見問題解答之常用函數的包含文件

函數 包含 類別 功能_atold math.h 數學子程序 把字符串轉換為浮點數_beginthread process.h 進程控制子程序 啟動執行一個新線程_bios_disk bios.h 接口子程序 輸出BIOS磁…

c語言猜四位數游戲猜10次,C語言猜數字游戲--隨機生成4個不相同的數字從小到大排序,用戶開始游戲,如果用戶猜對數字和數字對應的位置,界面回饋A,如果數字正確位置不正確,則回饋B...

1.看程序運行截圖吧!!由于博主本人較笨,就不動畫演示了,如果動畫的話可能將是一個漫長的過程!猜數字游戲.png2.游戲題目隨機生成4個不相同的數字從小到大排序,用戶開始游戲,如果用戶猜對數字和數…

雙端堆c語言,數據結構——雙端堆(C語言)

定義雙端堆:是一棵完全二叉樹,該完全二叉樹要么為空,要么同時滿足下列性質:(1) 根節點不包含元素;(2) 左子樹是一個最小堆;(3) 右子樹是一個最大堆;(4) 如果右子樹不空,令i是左子樹中…

C語言和我的世界指令哪個難,我的世界難度有什么區別 難度選擇指令介紹

我的世界中的難度(Difficulty)可以在Minecraft的選項菜單內切換。更改這個選項將直接影響到游戲本身。選項中并沒有設定影響攻擊性生物的可生成數量,包括和平模式。目前游戲共有和平、簡單、普通和困難4種難度。我的世界難度區別和平:會生成攻擊性生物&a…

w ndows10即將停止更新,微軟開始警告Windows 10 v1909用戶即將停止更新服務

如果您仍在運行Windows 10版本1909,版本1903或更早版本,則可能已經在系統任務欄中注意到一條新消息:Windows 10版本即將終止服務。根據Windows 10 May 2020 Update或2020年10月Update。為了將用戶升級到最新版本的Windows 10,“您…

篩法求素數c 語言,位篩法求素數,有段代碼看不懂,有大佬可以來說一下

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓就是BITArray[ (i -3)/ CHAR_BIT ]其中i從0開始,那下標不就為負了?而指向的又是哪個數據?下面是完整代碼。#include #include #include #include #include #include#include int main( ){unsigne…

c語言中日期間的天數怎么計算,關于計算兩個日期間天數的代碼,大家來看看...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓這是原貼:http://post.baidu.com/f?kz100411727這是原碼:#include "stdio.h"main(){long int i,a[2],b[2],c[2],x[12]{0,31,59,90,120,151,181,212,243,273,304,334},y,z[2];scanf("%ld-%ld-%ld %ld-%ld-%ld"…

linux nf conntrack,Linux基于mark的策略路由以及nf_conntrack RELATED

談到什么是意義,話題總顯得很大,近日每晚都和老城里的朋友聊老城的文化,老城的老房子,老城的叫賣聲,老城的方言…進行了很多的思考,也挺充實。至于技術方面,也有跟朋友以及前同事聊過&#xff0…

android 根據資源名稱,如何在Android中按名稱訪問可繪制資源

你可以做這樣的事情。public static Drawable getDrawable(String name) {Context context YourApplication.getContext();int resourceId context.getResources().getIdentifier(name, "drawable", YourApplication.getContext().getPackageName());return contex…

Android10不能用谷歌,谷歌真的很嚴格,一大波老APP將不能在安卓10.0運行

蘋果iOS的一大優點就是軟件生態,第三方APP都會主動適配新的iOS系統以及手機。雖然說Android的開放性是也是一大優點,但是第三方軟件參差不齊的優化適配水平也讓安卓的用戶非常頭疼。不過谷歌每年都在致力于讓Android的軟件生態更好。根據XDA的報道&#…

android 回歸測試,android測試:monkey使用方法

android測試:monkey使用方法Android Sdk給我們提供了Monkey和Monkeyrunner這兩個自動化測試工具。一、什么是MonkeyMonkey是一個命令行工具,可以運行在模擬器里或實際設備中。它向系統發送偽隨機的用戶事件流,實現對正在開發的應用程序進行壓…