1. 程式人生 > >互斥鎖,自旋鎖與自適應自旋鎖

互斥鎖,自旋鎖與自適應自旋鎖

執行緒安全與鎖的優化

互斥鎖:

從 實現原理上來講,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上進行忙等待並不停的進行鎖請求,直到得到這個鎖為止。
適用場景


(1) 如果是多核處理器,如果預計執行緒等待鎖的時間較長,至少比兩次執行緒上下文切換的時間要長,建議使用互斥量
(2) 如果是單核處理器,一般建議不要使用自旋鎖。因為,在同一時間只有一個執行緒是處在執行狀態,那如果執行執行緒發現無法獲取鎖,只能等待解鎖,但因為自身不掛起,所以那個獲取到鎖的執行緒沒有辦法進入執行狀態,只能等到執行執行緒把作業系統分給它的時間片用完,才能有機會被排程。這種情況下使用自旋鎖的代價很高。

自旋鎖

自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起呼叫者立即睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者不放棄處理器的執行時間, 進行忙迴圈(自旋), 看是否該自旋鎖的保持者已經釋放了鎖,”自旋”一詞就是因此而得名。(JDK1.6以後預設開啟了自旋鎖

) 自旋的次數預設是10次

有些不足之處:
1、自旋鎖一直佔用CPU,他在未獲得鎖的情況下,一直執行--自旋,所以佔用著CPU,如果不能在很短的時 間內獲得鎖,這無疑會使CPU效率降低。
2、在用自旋鎖時有可能造成死鎖,當遞迴呼叫時有可能造成死鎖,呼叫有些其他函式也可能造成死鎖,如 copy_to_user()、copy_from_user()、kmalloc()等。
因此我們要慎重使用自旋鎖,自旋鎖只有在核心可搶佔式或SMP的情況下才真正需要,在單CPU且不可搶佔式的核心下,自旋鎖的操作為空操作。自旋鎖適用於鎖使用者保持鎖時間比較短的情況下。
適用場景
如果是多核處理器

,如果預計執行緒等待鎖的時間很短,短到比執行緒兩次上下文切換時間要少的情況下,使用自旋鎖是划算的

自適應的自旋鎖

JDK1.6中引入了自適應的自旋鎖。 自適應意味著自旋的時間不再是固定的, 而是由前一次在同一個鎖上的自旋時間以及鎖擁有者的狀態來決定。如果在同一個鎖物件上, 自旋等待剛好成功獲得鎖, 並且在持有鎖的執行緒在執行中, 那麼虛擬機器就會認為這次自旋也是很有可能獲得鎖, 進而它將允許自旋等待相對更長的時間

不足與使用場景與自旋鎖相同。

相關推薦

互斥,適應

執行緒安全與鎖的優化 互斥鎖: 從 實現原理上來講,Mutex屬於sleep-waiting型別的鎖。例如在一個雙核的機器上有兩個執行緒(執行緒A和執行緒B),它們分別執行在Core0和 Core1上。假設執行緒A想要通過pthread_mutex_lock

適應(不看後悔,看了必懂)

自旋鎖 所謂自旋,就是指當有另外一個執行緒來競爭鎖時,這個執行緒會在原地迴圈等待,而不是把該執行緒給阻塞,直到那個獲得鎖的執行緒釋放鎖之後,這個執行緒就可以馬上獲得鎖的。鎖在原地迴圈的時候,是會消耗cpu的,就相當於在執行一個啥也沒有的for迴圈。 本來一個執行緒把鎖釋放之後,當前執行緒

10.Linux核心設計實現 P148---總結 (轉)

自旋鎖可分為用在單核處理器上和用在多核處理器上。單核處理器:用在單核處理器上,又可分為兩種:1.系統不支援核心搶佔此時自旋鎖什麼也不做,確實也不需要做什麼,因為單核處理器只有一個執行緒在執行,又不支援核心搶佔,因此資源不可能會被其他的執行緒訪問到。2.系統支援核心搶佔這種情況下,自旋鎖加鎖僅僅是禁止了核心搶佔

排查的小竅門 --使用jdk帶管理工具jstack

pre ble new deadlock 一段 指令 tro bject print 本文版權歸 遠方的風lyh和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作。 開發時間久了,難免會寫出一些一些死鎖的代碼,自己明明調用該方法可該方法就是不執行、不進該

定義快取系統,使用讀寫

package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurre

【轉】WPF定義控制元件樣式(13)-定義窗體Window & 適應內容大小訊息框MessageBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 自定義Window窗體樣式; 基於自定義窗體實現自定義MessageBox訊息提示框; 二.自定義Window窗體樣式   自定義的Window

互斥——多個執行緒同時搶一把出現的問題處理方式

1、執行緒鎖的介紹 1.1 建立互斥鎖:        (1) 靜態互斥鎖初始化:pthread_mutex_t mutex_x= PTHREAD_MUTEX_INITIALIZER;                     此句建立鎖後,可以直接使用 pthread_

記錄:小程式前端開發之tab選項卡swiper高度適應的問題解決記錄

小白前端,記錄一下自己平時遇到的問題與解決方案,方便用到的時候檢視。 今天,自己弄了一個選項卡,選項卡內容沒有問題,可是到了選項卡下面的swiper的時候,就卡住了,我的需求是swiper裡面的內容可以根據資料來自適應高度。因為swiper小程式必須要有固定的高度,不然就得

【css】移動端適應佈局字型大小適應

一、vw, vh vw它是根據可視區的寬度來計算的。 vh它是根據可視區的高度來計算的。 <body> <style> body { margin:0; } .te

守護程序,互斥,IPC,佇列,生產者消費者模型

小知識點:在子程序中不能使用input輸入! 一.守護程序 守護程序表示一個程序b 守護另一個程序a 當被守護的程序結束後,那麼守護程序b也跟著結束了 應用場景:之所以開子程序,是為了幫助主程序完成某個任務,然而,如果主程序認為自己的事情一旦做完了就沒有必要使用子程序了,就可以將子程序設定為守護程序

實現JTable的列寬內容的適應

 JTable預設的各列寬度平均,下函式可以實現各列寬度與內容長度適應!來自網際網路~ public void FitTableColumns(JTable myTable){  JTableHeader header = myTable.getTableHeader()

多執行緒之互斥(By C++)多程序

#include<Windows.h> #include<iostream> using namespace std; //互斥鎖 HANDLE hMutex1; HANDLE hMutex2; int flag; DWORD WINAPI MyThread2(LPVOID lp

讀寫------程序的同步互斥

讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進行讀訪問,寫者則需要對共享資源進行寫操作。這種鎖相對於自旋鎖而言,能提高併發性,因為在多處理器系統中,它允許同時有多個讀者來訪問共享資源,最大可能的讀者數為實際的邏輯CPU數

解決NSAttributedStringUILabel高度適應計算問題

兩個類擴充套件方法: /**  *  修改富文字的顏色  *  *  @param str   要改變的string  *  @param color 設定顏色  *  @param range 設定顏色的文字範圍  *  *  @return 新的AttributedString  */ - (NSMut

MySQL Innodb表導致死日誌情況分析歸納

進程 設置 歸納 操作數 into time uid int 死鎖 發現當備份表格的sql語句與刪除該表部分數據的sql語句同時運行時,mysql會檢測出死鎖,並打印出日誌 案例描述在定時腳本運行過程中,發現當備份表格的sql語句與刪除該表部分數據的

《java並發編程實戰》讀書筆記8--死,性能可伸縮性,粒度分解分段

線程 com display 次數 傳遞 pan blog right 影響 第10章 避免活躍性危險 10.1 死鎖 -10.1.1 鎖順序死鎖 最簡單的一種死鎖形式: -10.1.2 動態的鎖順序死鎖 可以通過下面的方法來解決: -10.1.3 在協

初步了解更新(U)排它(X)

alt sso asc tar south 初步 acer 導致 fonts ?? 一直沒有認真了解UPDATE操作的鎖。近期在MSDN論壇上看到一個問題,詢問堆表更新的死鎖問題,問題非常easy,有相似這種表及數據:CREATE TABLE dbo.t

html有序列表無序列表定義列表

專家 c專家編程 c陷阱與缺陷 設計 無序 pre utf 結構 語言 <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="content-type" cont

線程全局解釋器(GIL)

lob directly nds true 大寫 時間 pen 概論 har 一、線程概論 1、何為線程 每個進程有一個地址空間,而且默認就有一個控制線程。如果把一個進程比喻為一個車間的工作過程那麽線程就是車間裏的一個一個流水線。 進程只是用來把資源集中到一起(進程只是一個

【2017-12-06】winfrom 窗體啟最大化,控件適應

win con form width from int public osi convert 先將窗體windowstate屬性設置為Maximized public partial class Form1 : Form { public F