Pthreads mutex vs Pthreads spinlock
http://www.searchtb.com/2011/01/pthreads-mutex-vs-pthread-spinlock.html
鎖機制(lock) 是多線程編程中最常用的同步機制,用來對多線程間共享的臨界區(Critical Section) 進行保護。
Pthreads提供了多種鎖機制,常見的有:
1) Mutex(互斥量):pthread_mutex_***
2) Spin lock(自旋鎖):pthread_spin_***
3) Condition Variable(條件變量):pthread_con_***
4) Read/Write lock(讀寫鎖):pthread_rwlock_***
在多線程編中,根據應用場合的不同,選擇合適的鎖來進行同步,對多線程程序的性能影響非常大. 本文主要對 pthread_mutex 和 pthread_spinlock 兩種鎖制機進行比較,并討論其適用的場合.
1 Pthread mutex
Mutex屬于sleep-waiting類型的鎖. 從 2.6.x 系列穩定版內核開始, Linux 的 mutex 都是 futex (Fast-Usermode-muTEX)鎖.
futex(快速用戶區互斥的簡稱)是一個在Linux上實現鎖定和構建高級抽象鎖如信號量和POSIX互斥的基本工具。它們第一次出現在內核開發的2.5.7版;其語義在2.5.40固定下來,然后在2.6.x系列穩定版內核中出現。
Futex 是由Hubertus Franke(IBM Thomas J. Watson 研究中心), Matthew Kirkwood,Ingo Molnar(Red Hat)和 Rusty Russell(IBM Linux 技術中心)等人創建的。
Futex 是由用戶空間的一個對齊的整型變量和附在其上的內核空間等待隊列構成. 多進程或多線程絕大多數情況下對位于用戶空間的futex 的整型變量進行操作(匯編語言調用CPU提供的原子操作指令來增加或減少),而其它情況下,則需要通過代價較大的系統調用來對位于內核空間的等待隊列進行操作(如喚醒等待的進程/線程,或 將當前進程/線程放入等待隊列). 除了多個線程同時競爭鎖的少數情況外,基于 futex 的 lock 操作是不需要進行代價昂貴的系統調用操作的.
.
這種機制的核心思想是通過將大多數情況下非同時競爭 lock 的操作放到在用戶空間來執行,而不是代價昂貴的內核系統調用方式來執行,從而提高了效率.
Pthreads提供的Mutex鎖操作相關的API主要有:
1、 pthread_mutex_lock (pthread_mutex_t *mutex);
2、 pthread_mutex_trylock (pthread_mutex_t *mutex);
3、 pthread_mutex_unlock (pthread_mutex_t *mutex);
因為源代碼比較長,這里不做摘錄,大家可以參考:
glibc-2.12.2/nptl/pthread_mutex_lock.c
2 Pthread spinlock
spinlock,也稱自旋鎖,是屬于busy-waiting類型的鎖.在多處理器環境中, 自旋鎖最多只能被一個可執行線程持有。如果一個可執行線程試圖獲得一個被爭用(已經被持有的)自旋鎖,那么該線程就會一直進行忙等待,自旋,也就是空轉,等待鎖重新可用。如果鎖未被爭用,請求鎖的執行線程便立刻得到它,繼續執行。
一個被爭用的自旋鎖使得請求它的線程在等待鎖重新可用時自旋,特別的浪費CPU時間,所以自旋鎖不應該被長時間的持有。實際上,這就是自旋鎖的設計初衷,在短時間內進行輕量級加鎖。
Kernel中的自旋鎖不能夠在能夠導致睡眠的環境中使用。舉個例子,一個線程A獲得了自旋鎖L;這個時候,發生了中斷,在對應的中斷處理函數B中,也嘗試獲得自旋鎖L,就會中斷處理程序進行自旋。但是原先鎖的持有者只有在中斷處理程序結束后,采用機會釋放自旋鎖,從而導致死鎖。
由于涉及到多個處理器環境下,spin lock的效率非常重要。因為在等待spin lock的過程,處理器只是不停的循環檢查,并不執行其他指令。但即使這樣, 一般來說,spinlock的開銷還是比進程調度(context switch)少得多。這就是spin lock 被廣泛應用在多處理器環境的原因
原博客還有更為詳細的對比
總結的話,就是被spinlock鎖住的線程要不停的自旋空轉,檢查鎖是否能用,所以很占cpu資源,但是它的好處在于,如果線程數量和cpu數量相仿時,并發的效率會極大的提升
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Pthreads mutex vs Pthreads spinlock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: thread local storage
- 下一篇: copy vs. uninitializ