自旋鎖和互斥鎖的區別

POSIX threads(簡稱Pthreads)是在多核平臺上進行並行編程的一套API。線程同步是並行編程中很是重要的通信手段,其中最典型的應用就是用編程

Pthreads提供的鎖機制(lock)來對多個線程之間的共享臨界區(Critical Section)進行保護(另外一種經常使用的同步機制是barrier)。函數

Pthreads提供了多種鎖機制:線程

  • Mutex(互斥量):pthread_mutex_t
  • Spin lock(自旋鎖): pthread_spin_t
  • Condition Variable(條件變量): pthread_cond_t
  • Read/Write lock(讀寫鎖):pthread_rwlock_t

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就會被阻塞,資源

Core0會在此時進行上下文切換(Context Switch)將線程A置於等待隊列中,此時Core0就能夠運行其它的任務而沒必要進行忙等待。而Spin lock同步

則否則,它屬於busy-waiting類型的鎖,若是線程A是使用pthread_spin_lock操做去請求鎖,那麼線程A就會一直在Core0上進行忙等待並不停的進行鎖請求,直到獲得這個鎖爲止。it

自旋鎖(Spin lock)io

自旋鎖與互斥鎖有點相似,只是自旋鎖不會引發調用者睡眠,若是自旋鎖已經被別的執行單元保持,調用者就一直循環在那裏看是否該自旋鎖的保持者已經釋放了鎖,「自旋鎖」的做用thread

是爲了解決某項資源的互斥使用。由於自旋鎖不會引發調用者睡眠,因此自旋鎖的效率遠高於互斥鎖。

自旋鎖的不足之處:

自旋鎖一直佔用着CPU,他在未得到鎖的狀況下,一直運行(自旋),因此佔用着CPU,若是不能在很短的時間內得到鎖,這無疑會使CPU效率下降。

在用自旋鎖時有可能形成死鎖,當遞歸調用時有可能形成死鎖,調用有些其餘函數也可能形成死鎖,如 copy_to_user()、copy_from_user()、kmalloc()等。

所以咱們要慎重使用自旋鎖,自旋鎖只有在內核可搶佔式或SMP的狀況下才真正須要,在單CPU且不可搶佔式的內核下,自旋鎖的操做爲空操做。自旋鎖適用於鎖使用者保持鎖時間比較短的狀況下。

相關文章
相關標籤/搜索