- 我最近開了幾個專欄,誠信互三!
====> |||《算法專欄》::刷題教程來自網站《代碼隨想錄》。|||
====> |||《C++專欄》::記錄我學習C++的經歷,看完你一定會有收獲。|||
====> |||《Linux專欄》::記錄我學習Linux的經歷,看完你一定會有收獲。|||
====> |||《C#專欄》::記錄我復習C#的經歷,深度理解,查漏補缺,不定期更新。|||
====> |||《計算機網絡專欄》::記錄我學習計算機網絡,看完你一定會有收獲。|||
保護共享資源的方法(鎖)
- 保護共享資源要做到什么
- 什么是鎖
- 為什么要有鎖
- 鎖的創建
- 鎖的初始化
- 鎖的銷毀
- 加鎖和解鎖
- 以搶票系統了解鎖的使用
保護共享資源要做到什么
我們要保護共享資源,我們其實無外乎做到兩點即可。
1).互斥:及同一時間內只有一個執行流訪問共享資源。
2).同步:及訪問共享資源要有一定的順序。
滿足上述兩點,則共享資源就被保護起來了,被稱為臨界資源。
什么是鎖
鎖是完成線程互斥的一種方法,它可以讓共享資源在同一時間內,只被一個執行流訪問。
鎖的底層原理其實相當簡單,我們可以將鎖想象成一個整數1,只有線程拿到這個整數1,才可以執行后面的代碼,否則就阻塞,在執行完后,再把鎖還回去。
為什么要有鎖
鎖是線程進行互斥的常用手段,鎖的存在讓我們可以保護共享內存,讓原本并發執行的線程串行執行,防止出現出乎意料的結果。
鎖的創建
鎖的創建其實是一個原生線程庫的內置類型。
pthread_mutex_t
這就是鎖類型,我們在對這個類型初始化就得到了一把鎖。
要注意,如果鎖是局部的,則需要使用初始化接口,如果是全局的鎖,則可以使用宏PTHREAD_MUTEX_INITIALIZER來初始化。
鎖的初始化
全局鎖,使用宏初始化,局部鎖,使用接口初始化。
pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
參數1:代表初始化那個鎖,要傳入一個指針。
參數2:設置鎖的屬性,傳入nullptr為默認屬性。
鎖的銷毀
不論是全局鎖還是局部鎖,都需要使用接口銷毀。
pthread_mutex_destroy(pthread_mutex_t *mutex)
參數1:直接指定某個鎖,銷毀
加鎖和解鎖
給某個線程加鎖,只需要在該線程中對臨界區加鎖,保護共享資源就是保護訪問共享資源的代碼
加鎖解鎖要注意以下幾點
1).加鎖和解鎖要盡量細致。
2).加鎖后,加鎖的部分可以視為“原子操作”
3).加鎖后要注意解鎖,不然多線程可能導致死鎖問題
pthread_mutex_lock(pthread_mutex_t *mutex)
參數1:代表該線程加那把鎖。
pthread_mutex_unlock(pthread_mutex_t *mutex)
參數1:代表該線程解那把鎖
以搶票系統了解鎖的使用
搶票邏輯中,票數是共享資源,我們的每個線程都需要一直搶票,但是對于搶票邏輯我們需要加鎖,因為對共享資源的操作不是原子的,可能導致不可知的后果。