六、互斥鎖

01. 互斥鎖引入
爲什麼需要互斥鎖?

在多任務操作系統中,同時運行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裏,我在使用着打印機打印東西的同時(還沒有打印完),別人剛好也在此刻使用打印機打印東西,如果不做任何處理的話,打印出來的東西肯定是錯亂的。

下面我們用程序模擬一下這個過程,線程一需要打印“ hello ”,線程二需要打印“ world ”,不加任何處理的話,打印出來的內容會錯亂:


測試結果:


實際上,打印機是有做處理的,我在打印着的時候別人是不允許打印的,只有等我打印結束後別人才允許打印。這個過程有點類似於,把打印機放在一個房間裏,給這個房間安把鎖,這個鎖默認是打開的。當 A 需要打印時,他先過來檢查這把鎖有沒有鎖着,沒有的話就進去,同時上鎖在房間裏打印。而在這時,剛好 B 也需要打印,B 同樣先檢查鎖,發現鎖是鎖住的,他就在門外等着。而當 A 打印結束後,他會開鎖出來,這時候 B 才進去上鎖打印。

而在線程裏也有這麼一把鎖——互斥鎖(mutex),互斥鎖是一種簡單的加鎖的方法來控制對共享資源的訪問,互斥鎖只有兩種狀態,即加鎖( lock )和解鎖( unlock )。

02. 互斥鎖的操作流程
1)在訪問共享資源後臨界區域前,對互斥鎖進行加鎖。

2)在訪問完成後釋放互斥鎖上的鎖。

3)對互斥鎖進行加鎖後,任何其他試圖再次對互斥鎖加鎖的線程將會被阻塞,直到鎖被釋放。

互斥鎖的數據類型是: pthread_mutex_t。

03. 互斥鎖相關函數
3.1 互斥鎖初始化

可以使用宏 PTHREAD_MUTEX_INITIALIZER 靜態初始化互斥鎖,比如:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
這種方法等價於使用 NULL 指定的 attr 參數調用 pthread_mutex_init() 來完成動態初始化,不同之處在於 PTHREAD_MUTEX_INITIALIZER 宏不進行錯誤檢查。

3.2 互斥鎖加鎖
 
3.3 互斥鎖解鎖

3.4 互斥鎖銷燬

04. 互斥鎖示例
示例代碼如下:



測試結果:


版權聲明:本文爲CSDN博主「滄海一笑-dj」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/dengjin20104042056/article/details/102963149

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章