pthread_mutex_xx 與 pthread_spin_lock的區別和聯絡

來源:互聯網
上載者:User

POSIX threads(簡稱Pthreads)是在多核平台上進行並行編程的一套常用的API。線程同步(Thread Synchronization)是並行編程中非常重要的通訊手段,其中最典型的應用就是用Pthreads提供的鎖機制(lock)來對多個線程之間共 享的臨界區(Critical Section)進行保護(另一種常用的同步機制是barrier)。
Pthreads提供了多種鎖機制:
(1) Mutex(互斥量):pthread_mutex_***
(2) Spin lock(自旋鎖):pthread_spin_***
(3) Condition Variable(條件變數):pthread_con_***
(4) Read/Write lock(讀寫鎖):pthread_rwlock_***
Pthreads提供的Mutex鎖操作相關的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鎖操作相關的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上進行忙等待並不停的進行鎖請求,直到得到這個鎖為止。

自旋鎖(Spin lock)

自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起調用者睡眠,如果自旋鎖已經被別的執行單元保持,調用者就一直迴圈在那裡看是 否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。其作用是為瞭解決某項資源的互斥使用。因為自旋鎖不會引起調用者睡眠,所以自旋鎖的效率遠 高於互斥鎖。雖然它的效率比互斥鎖高,但是它也有些不足之處:
1、自旋鎖一直佔用CPU,他在未獲得鎖的情況下,一直運行--自旋,所以佔用著CPU,如果不能在很短的時 間內獲得鎖,這無疑會使CPU效率降低。
2、在用自旋鎖時有可能造成死結,當遞迴調用時有可能造成死結,調用有些其他函數也可能造成死結,如 copy_to_user()、copy_from_user()、kmalloc()等。
因此我們要謹慎使用自旋鎖,自旋鎖只有在核心可搶佔式或SMP的情況下才真正需要,在單CPU且不可搶佔式的核心下,自旋鎖的操作為空白操作。自旋鎖適用於鎖使用者保持鎖時間比較短的情況下。
自旋鎖的用法如下:
首先定義:spinlock_t x;
然後初始化:spin_lock_init(spinlock_t *x); //自旋鎖在真正使用前必須先初始化
在2.6.11核心中將定義和初始化合并為一個宏:DEFINE_SPINLOCK(x)
獲得自旋鎖:spin_lock(x); //只有在獲得鎖的情況下才返回,否則一直“自旋”
spin_trylock(x); //如立即獲得鎖則返回真,否則立即返回假
釋放鎖:spin_unlock(x);
結合以上有以下程式碼片段:
spinlock_t lock; //定義一個自旋鎖
spin_lock_init(&lock);
spin_lock(&lock);
....... //臨界區
spin_unlock(&lock); //釋放鎖
還有一些其他用法:
spin_is_locked(x)
//  該宏用於判斷自旋鎖x是否已經被某執行單元保持(即被鎖),如果是, 返回真,否則返回假。
spin_unlock_wait(x)
//  該宏用於等待自旋鎖x變得沒有被任何執行單元保持,如果沒有任何執行單元保持該自旋鎖,該宏立即返回,否
//將迴圈 在那裡,直到該自旋鎖被保持者釋放。
spin_lock_irqsave(lock, flags)
//  該宏獲得自旋鎖的同時把標誌寄存器的值儲存到變數flags中並失效本地中//斷。相當於:spin_lock()+local_irq_save()
spin_unlock_irqrestore(lock, flags)
//  該宏釋放自旋鎖lock的同時,也恢複標誌寄存器的值為變數flags儲存的//值。它與spin_lock_irqsave配對使用。
//相當於:spin_unlock()+local_irq_restore()
spin_lock_irq(lock)
  //該宏類似於spin_lock_irqsave,只是該宏不儲存標誌寄存器的值。相當 //於:spin_lock()+local_irq_disable()
spin_unlock_irq(lock)
//該宏釋放自旋鎖lock的同時,也使能本地中斷。它與spin_lock_irq配對應用。相當於: spin_unlock()+local_irq+enable()
spin_lock_bh(lock)
//  該宏在得到自旋鎖的同時失效本地非強制中斷。相當於: //spin_lock()+local_bh_disable()
spin_unlock_bh(lock)
//該宏釋放自旋鎖lock的同時,也使能本地的非強制中斷。它與spin_lock_bh配對//使用。相當於:spin_unlock()+local_bh_enable()
spin_trylock_irqsave(lock, flags)
//該宏如果獲得自旋鎖lock,它也將儲存標誌寄存器的值到變數flags中,並且失//效本地中斷,如果沒有獲得鎖,它什麼也不做。因此如果能夠立即 獲得鎖,它等//同於spin_lock_irqsave,如果不能獲得鎖,它等同於spin_trylock。如果該宏//獲得自旋鎖lock,那需要 使用spin_unlock_irqrestore來釋放。
spin_trylock_irq(lock)
//該宏類似於spin_trylock_irqsave,只是該宏不儲存標誌寄存器。如果該宏獲得自旋鎖lock,需要使用spin_unlock_irq來釋放。
spin_trylock_bh(lock)
//  該宏如果獲得了自旋鎖,它也將失效本地非強制中斷。如果得不到鎖,它什麼//也不做。因此,如果得到了鎖,它等同於spin_lock_bh,如果得 不到鎖,它等同//於spin_trylock。如果該宏得到了自旋鎖,需要使用spin_unlock_bh來釋放。
spin_can_lock(lock)
//  該宏用於判斷自旋鎖lock是否能夠被鎖,它實際是spin_is_locked取反。//如果lock沒有被鎖,它返回真,否則,返回 假。該宏在2.6.11中第一次被定義,在//先前的核心中並沒有該宏。
自旋鎖的獲得和釋放有多種方法,要根據場合選擇,可以去http://soft.yesky.com/os/lin/10/2303010_4.shtml
看看,介紹了很多關於自旋鎖的使用知識。本文引用了很多上面的知識

 

 

Reference:

1. http://blog.csdn.net/kyokowl/article/details/6294341

2. http://www.searchtb.com/2011/01/pthreads-mutex-vs-pthread-spinlock.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.