自旋鎖,互斥鎖,訊號量
樂觀鎖和悲觀鎖只是一種理論,是從思想上劃分的。自旋鎖和互斥鎖是應用層確確實實的鎖,用於同步訪問控制
,如果一定要劃分,從只有乙個執行緒可以擁有鎖來說,我覺得自旋鎖和互斥鎖應該都屬於悲觀鎖,因為一般的應用不需要支援事物回滾的操作。但是沈詢的直播中說,互斥鎖屬於悲觀鎖(sleep),自旋鎖屬於樂觀鎖(輪詢)。因此可能樂觀鎖,悲觀鎖早就不是資料庫級的那種老定義了。
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
上進行忙等待並不停的進行鎖請求,直到得到這個鎖為止。
所以,自旋鎖一般用
於多核的伺服器
(需要一直占用cpu資源
),臨界區持有時間比較短的競爭(占用cpu的時間不會太長,避免執行緒切換,就可以擁有鎖
),讀大於寫的場景。
訊號量、互斥鎖和自旋鎖的區別
訊號量、
互斥鎖允許程序sleep屬於睡眠鎖,自旋鎖不允許呼叫者
sleep
,而是讓其迴圈等待,所以有以下區別應用:
ø 訊號量和讀寫訊號量適合於保持時間較長的情況,它們會導致呼叫者睡眠,因而自旋鎖適合於保持時間非常短的情況;
ø 自旋鎖可以用於中斷,不能用於程序上下文(會引起死鎖
),而訊號量不允許使用在中斷中,而可以用於程序上下文;
ø 自旋鎖保持期間是搶占失效的,自旋鎖被持有時,核心不能被搶占,而訊號量和讀寫訊號量保持期間是可以被搶占的。
另外需要注意的是:
ø 訊號量鎖保護的臨界區可包含可能引起阻塞的**,而自旋鎖則絕對要避免用來保護包含這樣**的臨界區,因為阻塞意味著要進行程序的切換,如果程序被切換出去後,另一程序企圖獲取本自旋鎖,死鎖就會發生;
ø 占用訊號量的同時不能占用自旋鎖,因為在等待訊號量時可能會睡眠,而在持有自旋鎖時是不允許睡眠的。
ø 訊號量主要適用於程序間通訊,當然,也可用於執行緒間通訊。而互斥鎖
,自旋鎖
只能用於執行緒間通訊。
訊號量,互斥鎖,自旋鎖
個人理解 訊號量 程序間的通訊機制 單一個數的訊號 與訊息郵箱,訊息佇列,機理類同,量不同,用訊號量肯定掉cpu 自旋鎖 保護區域不掉cpu,持續查詢,等待 不可用時域長狀態 切記 時域範圍 在程序間的通訊機制函式狀態 鎖 0 互斥鎖與自旋鎖 互斥鎖 執行緒會從sleep 加鎖 running 解鎖...
自旋鎖,訊號量,互斥鎖比較
為了避免併發,防止競爭。核心提供了一組同步方法來提供對共享資料的保護。我們的重點不是介紹這些方法的詳細用法,而是強調為什麼使用這些方法和它們之間的差別。linux使用的同步機制可以說從2.0到2.6以來不斷發展完善。從最初的原子操作,到後來的訊號量,從大核心鎖到今天的自旋鎖。這些同步機制的發展伴隨l...
訊號量,互斥鎖
注 摘自 程式設計師的自我修養 相關章節。關鍵字 執行緒同步 原子操作 鎖 二元訊號量 訊號量 互斥量 臨界區 讀寫鎖 條件變數 原子操作 共享資料 全域性變數或堆變數 的自增 操作在多執行緒環境下會出現錯誤是因為這個操作 一條c語句 被編譯為彙編 後不止一條指令,因此在執行的時候可能執行了一半就被...