自旋鎖,互斥鎖,訊號量

2021-07-27 17:32:04 字數 2515 閱讀 5051

自旋鎖,互斥鎖,訊號量

樂觀鎖和悲觀鎖只是一種理論,是從思想上劃分的。自旋鎖和互斥鎖是應用層確確實實的鎖,用於同步訪問控制

,如果一定要劃分,從只有乙個執行緒可以擁有鎖來說,我覺得自旋鎖和互斥鎖應該都屬於悲觀鎖,因為一般的應用不需要支援事物回滾的操作。但是沈詢的直播中說,互斥鎖屬於悲觀鎖(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語句 被編譯為彙編 後不止一條指令,因此在執行的時候可能執行了一半就被...