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