自旋鎖 和 互斥鎖
Pthreads提供了多種鎖機制:
(1) Mutex(互斥量):
pthread_mutex_***
(2) Spin lock(自旋鎖):
pthread_spin_***
(3) Condition Variable(條件變量):
pthread_con_***
(4) Read/Write lock(讀寫鎖):
pthread_rwlock_***
Pthreads提供的Mutex鎖操作相關(guān)的API主要有:
pthread_mutex_lock (pthread_mutex_t *mutex);
pthread_mutex_trylock (pthread_mutex_t *mutex);
pthread_mutex_unlock (pthread_mutex_t *mutex);
Pthreads提供的與Spin Lock鎖操作相關(guān)的API主要有:
pthread_spin_lock (pthread_spinlock_t *lock);
pthread_spin_trylock (pthread_spinlock_t *lock);
pthread_spin_unlock (pthread_spinlock_t *lock);
從 實現(xiàn)原理上來講,Mutex屬于sleep-waiting類型的鎖兽掰。例如在一個雙核的機器上有兩個線程(線程A和線程B)市栗,它們分別運行在Core0和 Core1上。假設(shè)線程A想要通過pthread_mutex_lock操作去得到一個臨界區(qū)的鎖卦洽,而此時這個鎖正被線程B所持有替蛉,那么線程A就會被阻塞 (blocking)戏锹,Core0 會在此時進行上下文切換(Context Switch)將線程A置于等待隊列中冠胯,此時Core0就可以運行其他的任務(wù)(例如另一個線程C)而不必進行忙等待。而Spin lock則不然锦针,它屬于busy-waiting類型的鎖荠察,如果線程A是使用pthread_spin_lock操作去請求鎖,那么線程A就會一直在 Core0上進行忙等待并不停的進行鎖請求伞插,直到得到這個鎖為止割粮。
所以,自旋鎖一般用用多核的服務(wù)器媚污。
自旋鎖(Spin lock)
自旋鎖與互斥鎖有點類似舀瓢,只是自旋鎖不會引起調(diào)用者睡眠,如果自旋鎖已經(jīng)被別的執(zhí)行單元保持耗美,調(diào)用者就一直循環(huán)在那里看是 否該自旋鎖的保持者已經(jīng)釋放了鎖京髓,"自旋"一詞就是因此而得名。其作用是為了解決某項資源的互斥使用商架。因為自旋鎖不會引起調(diào)用者睡眠堰怨,所以自旋鎖的效率遠(yuǎn) 高于互斥鎖。雖然它的效率比互斥鎖高蛇摸,但是它也有些不足之處:
- 1备图、自旋鎖一直占用CPU,他在未獲得鎖的情況下,一直運行--自旋揽涮,所以占用著CPU抠藕,如果不能在很短的時 間內(nèi)獲得鎖,這無疑會使CPU效率降低蒋困。
- 2盾似、在用自旋鎖時有可能造成死鎖,當(dāng)遞歸調(diào)用時有可能造成死鎖雪标,調(diào)用有些其他函數(shù)也可能造成死鎖零院,如 copy_to_user()、copy_from_user()村刨、kmalloc()等告抄。
因此我們要慎重使用自旋鎖,自旋鎖只有在內(nèi)核可搶占式或SMP的情況下才真正需要烹困,在單CPU且不可搶占式的內(nèi)核下玄妈,自旋鎖的操作為空操作乾吻。自旋鎖適用于鎖使用者保持鎖時間比較短的情況下髓梅。
ibireme的備注
關(guān)于鎖:
OSSpinLock 自旋鎖,性能最高的鎖绎签。原理很簡單枯饿,就是一直 do while 忙等。它的缺點是當(dāng)?shù)却龝r會消耗大量 CPU 資源诡必,所以它不適用于較長時間的任務(wù)奢方。對于內(nèi)存緩存的存取來說,它非常合適爸舒。
dispatch_semaphore 是信號量蟋字,但當(dāng)信號總量設(shè)為 1 時也可以當(dāng)作鎖來。在沒有等待情況出現(xiàn)時扭勉,它的性能比 pthread_mutex 還要高鹊奖,但一旦有等待情況出現(xiàn)時,性能就會下降許多涂炎。相對于 OSSpinLock 來說忠聚,它的優(yōu)勢在于等待時不會消耗 CPU 資源。對磁盤緩存來說唱捣,它比較合適两蟀。
互斥鎖和信號了的區(qū)別
- 互斥量用于線程的互斥,信號線用于線程的同步
這是互斥量和信號量的根本區(qū)別震缭,也就是互斥和同步之間的區(qū)別赂毯。
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序党涕,即訪問是無序的活烙。
同步:是指在互斥的基礎(chǔ)上(大多數(shù)情況),通過其它機制實現(xiàn)訪問者對資源的有序訪問遣鼓。在大多數(shù)情況下啸盏,同步已經(jīng)實現(xiàn)了互斥,特別是所有寫入資源的情況必定是互斥的骑祟。少數(shù)情況是指可以允許多個訪問者同時訪問資源
- 互斥量值只能為0/1回懦,信號量值可以為非負(fù)整數(shù)。
也就是說次企,一個互斥量只能用于一個資源的互斥訪問怯晕,它不能實現(xiàn)多個資源的多線程互斥問題。信號量可以實現(xiàn)多個同類資源的多線程互斥和同步缸棵。當(dāng)信號量為單值信號量是舟茶,也可以完成一個資源的互斥訪問。
- 互斥量的加鎖和解鎖必須由同一線程分別對應(yīng)使用堵第,信號量可以由一個線程釋放吧凉,另一個線程得到。