unix環境高階程式設計 自旋鎖

2021-08-04 09:37:51 字數 2422 閱讀 1423

自旋鎖是smp架構中的一種low-level的同步機制。

當執行緒a想要獲取一把自旋鎖而該鎖又被其它執行緒鎖持有時,執行緒a會在乙個迴圈中自旋以檢測鎖是不是已經可用了。對於自選鎖需要注意:

使用任何鎖需要消耗系統資源(記憶體資源和cpu時間),這種資源消耗可以分為兩類:

1

int pthread_spin_destroy(pthread_spinlock_t *);

2int pthread_spin_init(pthread_spinlock_t *, int);3

int pthread_spin_lock(pthread_spinlock_t *);

4int pthread_spin_trylock(pthread_spinlock_t *);

5int pthread_spin_unlock(pthread_spinlock_t *);

pthread_spin_init用來申請使用自旋鎖所需要的資源並且將它初始化為非鎖定狀態。pshared的取值及其含義:

pthread_spin_lock用來獲取(鎖定)指定的自旋鎖. 如果該自旋鎖當前沒有被其它執行緒所持有,則呼叫該函式的執行緒獲得該自旋鎖.否則該函式在獲得自旋鎖之前不會返回。如果呼叫該函式的執行緒在呼叫該函式時已經持有了該自旋鎖,則結果是不確定的。

pthread_spin_trylock會嘗試獲取指定的自旋鎖,如果無法獲取則理解返回失敗。

pthread_spin_unlock用於釋放指定的自旋鎖。

pthread_spin_destroy用來銷毀指定的自旋鎖並釋放所有相關聯的資源(所謂的所有指的是由pthread_spin_init自動申請的資源)在呼叫該函式之後如果沒有呼叫pthread_spin_init重新初始化自旋鎖,則任何嘗試使用該鎖的呼叫的結果都是未定義的。如果呼叫該

函式時自旋鎖正在被使用或者自旋鎖未被初始化則結果是未定義的。

1 pthread_mutex_lock (pthread_mutex_t *mutex);

2 pthread_mutex_trylock (pthread_mutex_t *mutex);

3 pthread_mutex_unlock (pthread_mutex_t *mutex);

pthreads提供的與spin lock鎖操作相關的api主要有:
pthread_spin_lock (pthread_spinlock_t *lock

);pthread_spin_trylock (pthread_spinlock_t *lock

);pthread_spin_unlock (pthread_spinlock_t *lock);

從實現原理上來講,mutex屬於sleep-waiting型別的鎖。例如在乙個雙核的機器上有兩個執行緒(執行緒a和執行緒b),它們分別執行在core0和core1上。假設執行緒a想要通過pthread_mutex_lock操作去得到乙個臨界區的鎖,而此時這個鎖正被執行緒b所持有,那麼線

程a就會被阻塞(blocking),core0 會在此時進行上下文切換(context switch)將執行緒a置於等待佇列中,此時core0就可以執行其他的任務(例如另乙個執行緒c)而不必進行忙等待。而spin lock則不然,它屬於busy-waiting型別的鎖,如果執行緒a是使用

pthread_spin_lock操作去請求鎖,那麼執行緒a就會一直在 core0上進行忙等待並不停的進行鎖請求,直到得到這個鎖為止

如果大家去查閱linux glibc中對pthreads api的實現nptl(native posix thread library) 的原始碼的話(使用」getconf gnu_libpthread_version」命令可以得到我們系統中nptl的版本號),就會發現pthread_mutex_lock()操作如果沒有鎖成功的話就會

呼叫system_wait()的系統呼叫並將當前執行緒加入該mutex的等待佇列裡。而spin lock則可以理解為在乙個while(1)迴圈中用內嵌的彙編**實現的鎖操作(印象中看過一篇**介紹說在linux核心中spin lock操作只需要兩條cpu指令,解鎖操作只用一條指令就可以完

成)。有興趣的朋友可以參考另乙個名為sanos的微核心中pthreds api的實現:mutex.c spinlock.c,儘管與nptl中的**實現不盡相同,但是因為它的實現非常簡單易懂,對我們理解spin lock和mutex的特性還是很有幫助的。

對於自旋鎖來說,它只需要消耗很少的資源來建立鎖;隨後當執行緒被阻塞時,它就會一直重複檢查看鎖是否可用了,也就是說當自旋鎖處於等待狀態時它會一直消耗cpu時間。

cpu資源。

因此自旋鎖和互斥鎖適用於不同的場景。自旋鎖適用於那些僅需要阻塞很短時間的場景,而互斥鎖適用於那些可能會阻塞很長時間的場景。

自旋鎖(UNIX環境高階程式設計筆記)

自旋鎖與互斥量類似,但它不是通過休眠使程序阻塞,而是在獲取鎖之前一直處於忙等 自旋 阻塞狀態。自旋鎖可以用於以下情況 鎖被持有的時間短,而且執行緒並不希望在重新排程上花費太多的成本。很多互斥量的實現非常高效,以至於應用程式採用互斥鎖的效能與曾經採用過自旋鎖的效能基本是相同的。有些互斥量的實現在試圖獲...

unix環境高階程式設計 讀寫鎖

1.需要注意的地方 2.讀寫鎖適合的情況 讀寫鎖非常適合對於資料結構讀的次數遠大於寫的情況。3.讀寫鎖相關介面 讀寫鎖又稱為共享互斥鎖,是一種特殊的自旋鎖。讀模式又稱共享模式,寫模式又稱互斥模式。include int pthread rwlock init pthread rwlock t res...

unix環境高階程式設計

unix 日曆時間 自1970 年1 月1 日00 00 00 以來的國際標準時間 utc 程序時間 cpu 時間 時鐘時間 程序執行時間的總量。使用者cpu 時間 執行使用者指令時間量。系統cpu 時間 執行核心所經歷時間。命令 time 第三章至第七章 原子操作 任何乙個要求多於1 個函式呼叫的...