自旋鎖 和 互斥鎖

自旋鎖 和 互斥鎖

Pthreads提供了多種鎖機制:

(1) Mutex(互斥量):pthread_mutex_***

(2) Spin lock(自旋鎖):pthread_spin_***

(3) Condition Variable(條件變量):pthread_con_***

(4) Read/Write lock(讀寫鎖):pthread_rwlock_***

Pthreads提供的Mutex鎖操作相關(guān)的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鎖操作相關(guān)的API主要有:
pthread_spin_lock (pthread_spinlock_t *lock);
pthread_spin_trylock (pthread_spinlock_t *lock);
pthread_spin_unlock (pthread_spinlock_t *lock);

從 實現(xiàn)原理上來講,Mutex屬于sleep-waiting類型的鎖兽掰。例如在一個雙核的機器上有兩個線程(線程A和線程B)市栗,它們分別運行在Core0和 Core1上。假設(shè)線程A想要通過pthread_mutex_lock操作去得到一個臨界區(qū)的鎖卦洽,而此時這個鎖正被線程B所持有替蛉,那么線程A就會被阻塞 (blocking)戏锹,Core0 會在此時進行上下文切換(Context Switch)將線程A置于等待隊列中冠胯,此時Core0就可以運行其他的任務(wù)(例如另一個線程C)而不必進行忙等待。而Spin lock則不然锦针,它屬于busy-waiting類型的鎖荠察,如果線程A是使用pthread_spin_lock操作去請求鎖,那么線程A就會一直在 Core0上進行忙等待并不停的進行鎖請求伞插,直到得到這個鎖為止割粮。

所以,自旋鎖一般用用多核的服務(wù)器媚污。

自旋鎖(Spin lock)

自旋鎖與互斥鎖有點類似舀瓢,只是自旋鎖不會引起調(diào)用者睡眠,如果自旋鎖已經(jīng)被別的執(zhí)行單元保持耗美,調(diào)用者就一直循環(huán)在那里看是 否該自旋鎖的保持者已經(jīng)釋放了鎖京髓,"自旋"一詞就是因此而得名。其作用是為了解決某項資源的互斥使用商架。因為自旋鎖不會引起調(diào)用者睡眠堰怨,所以自旋鎖的效率遠(yuǎn) 高于互斥鎖。雖然它的效率比互斥鎖高蛇摸,但是它也有些不足之處:

  • 1备图、自旋鎖一直占用CPU,他在未獲得鎖的情況下,一直運行--自旋揽涮,所以占用著CPU抠藕,如果不能在很短的時 間內(nèi)獲得鎖,這無疑會使CPU效率降低蒋困。
  • 2盾似、在用自旋鎖時有可能造成死鎖,當(dāng)遞歸調(diào)用時有可能造成死鎖雪标,調(diào)用有些其他函數(shù)也可能造成死鎖零院,如 copy_to_user()、copy_from_user()村刨、kmalloc()等告抄。

因此我們要慎重使用自旋鎖,自旋鎖只有在內(nèi)核可搶占式或SMP的情況下才真正需要烹困,在單CPU且不可搶占式的內(nèi)核下玄妈,自旋鎖的操作為空操作乾吻。自旋鎖適用于鎖使用者保持鎖時間比較短的情況下髓梅。

ibireme的備注

關(guān)于鎖:

OSSpinLock 自旋鎖,性能最高的鎖绎签。原理很簡單枯饿,就是一直 do while 忙等。它的缺點是當(dāng)?shù)却龝r會消耗大量 CPU 資源诡必,所以它不適用于較長時間的任務(wù)奢方。對于內(nèi)存緩存的存取來說,它非常合適爸舒。

dispatch_semaphore 是信號量蟋字,但當(dāng)信號總量設(shè)為 1 時也可以當(dāng)作鎖來。在沒有等待情況出現(xiàn)時扭勉,它的性能比 pthread_mutex 還要高鹊奖,但一旦有等待情況出現(xiàn)時,性能就會下降許多涂炎。相對于 OSSpinLock 來說忠聚,它的優(yōu)勢在于等待時不會消耗 CPU 資源。對磁盤緩存來說唱捣,它比較合適两蟀。

互斥鎖和信號了的區(qū)別
    1. 互斥量用于線程的互斥,信號線用于線程的同步

這是互斥量和信號量的根本區(qū)別震缭,也就是互斥和同步之間的區(qū)別赂毯。
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序党涕,即訪問是無序的活烙。
同步:是指在互斥的基礎(chǔ)上(大多數(shù)情況),通過其它機制實現(xiàn)訪問者對資源的有序訪問遣鼓。在大多數(shù)情況下啸盏,同步已經(jīng)實現(xiàn)了互斥,特別是所有寫入資源的情況必定是互斥的骑祟。少數(shù)情況是指可以允許多個訪問者同時訪問資源

    1. 互斥量值只能為0/1回懦,信號量值可以為非負(fù)整數(shù)。

也就是說次企,一個互斥量只能用于一個資源的互斥訪問怯晕,它不能實現(xiàn)多個資源的多線程互斥問題。信號量可以實現(xiàn)多個同類資源的多線程互斥和同步缸棵。當(dāng)信號量為單值信號量是舟茶,也可以完成一個資源的互斥訪問。

    1. 互斥量的加鎖和解鎖必須由同一線程分別對應(yīng)使用堵第,信號量可以由一個線程釋放吧凉,另一個線程得到。
iOS 十種線程鎖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踏志,一起剝皮案震驚了整個濱河市阀捅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌针余,老刑警劉巖饲鄙,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異圆雁,居然都是意外死亡忍级,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門伪朽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轴咱,“玉大人,你說我怎么就攤上這事驱负∴戮粒” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵跃脊,是天一觀的道長宇挫。 經(jīng)常有香客問我,道長酪术,這世上最難降的妖魔是什么器瘪? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任翠储,我火速辦了婚禮,結(jié)果婚禮上橡疼,老公的妹妹穿的比我還像新娘援所。我一直安慰自己,他們只是感情好欣除,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布住拭。 她就那樣靜靜地躺著,像睡著了一般历帚。 火紅的嫁衣襯著肌膚如雪滔岳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天挽牢,我揣著相機與錄音谱煤,去河邊找鬼。 笑死禽拔,一個胖子當(dāng)著我的面吹牛刘离,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睹栖,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼硫惕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了磨淌?” 一聲冷哼從身側(cè)響起疲憋,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤凿渊,失蹤者是張志新(化名)和其女友劉穎梁只,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埃脏,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搪锣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彩掐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片构舟。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堵幽,靈堂內(nèi)的尸體忽然破棺而出狗超,到底是詐尸還是另有隱情,我是刑警寧澤朴下,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布努咐,位于F島的核電站,受9級特大地震影響殴胧,放射性物質(zhì)發(fā)生泄漏渗稍。R本人自食惡果不足惜佩迟,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竿屹。 院中可真熱鬧报强,春花似錦、人聲如沸拱燃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碗誉。三九已至坚嗜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诗充,已是汗流浹背苍蔬。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝴蜓,地道東北人碟绑。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像茎匠,于是被迫代替她去往敵國和親格仲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • POSIX threads(簡稱Pthreads)是在多核平臺上進行并行編程的一套常用的API诵冒。線程同步(Thre...
    北辰青閱讀 991評論 0 1
  • 1 臨界區(qū) 1.1簡介 在早期計算機系統(tǒng)中凯肋,只有一個任務(wù)進程在執(zhí)行,并不存在資源的共享與競爭汽馋。隨著技術(shù)和需求的飛速...
    Fly晴天里Fly閱讀 9,021評論 2 13
  • 引用自多線程編程指南應(yīng)用程序里面多個線程的存在引發(fā)了多個執(zhí)行線程安全訪問資源的潛在問題侮东。兩個線程同時修改同一資源有...
    Mitchell閱讀 1,984評論 1 7
  • iOS線程安全的鎖與性能對比 一、鎖的基本使用方法 1.1豹芯、@synchronized 這是我們最熟悉的枷鎖方式悄雅,...
    Jacky_Yang閱讀 2,212評論 0 17
  • 自旋鎖(spin lock)與互斥量(mutex)的比較 自旋鎖是一種非阻塞鎖,也就是說铁蹈,如果某線程需要獲取自旋鎖...
    lfp901020閱讀 5,298評論 0 4