日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

自旋锁和互斥锁实例_自旋锁和互斥锁的实现以及使用区别

發(fā)布時(shí)間:2023/12/31 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自旋锁和互斥锁实例_自旋锁和互斥锁的实现以及使用区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、自旋鎖和互斥鎖的實(shí)現(xiàn)

基于硬件原語(yǔ)的一些抽象(比如:中斷禁用、原子操作指令),怎么實(shí)現(xiàn)?可以參考清華大學(xué)操作公開(kāi)課(向勇、陳渝老師講的),以下摘抄一部分實(shí)現(xiàn)代碼來(lái)實(shí)現(xiàn)抽象。

Test And Set

bool Test_And_Set(bool*flag)

{bool rv = *flag;*flag =TRUE;returnrv;

}

這是一條機(jī)器指令,這條機(jī)器指令完成了通常操作的讀寫(xiě)兩條機(jī)器指令的工作,完成了三件事情:

從內(nèi)存中讀取值

測(cè)試該值是否為1(然后返回真或假)

內(nèi)存值設(shè)置為1

Exchange

void Exchange(bool *a, bool *b)

{bool tmp = *a;*a = *b;*b =tmp;

}

雖然這兩個(gè)指令看起來(lái)由幾條小指令組成,但是它已經(jīng)被封裝成了一條機(jī)器指令,這就意味著它在執(zhí)行的時(shí)候不會(huì)被打斷,不允許出現(xiàn)中斷或切換,這就是機(jī)器指令的語(yǔ)義保證。在此基礎(chǔ)上完成互斥。

這里看到如果鎖狀態(tài)value為1,表示臨界區(qū)現(xiàn)在被人占用,已經(jīng)上鎖了,這時(shí)調(diào)用Lock::Acquire()不能得到鎖,那么它會(huì)在這里死循環(huán),不斷測(cè)試value的值。這種空轉(zhuǎn)全用來(lái)消耗任務(wù)的時(shí)間片,顯然是可以有優(yōu)化空間的。例如發(fā)現(xiàn)獲取鎖失敗,則將任務(wù)置為睡眠狀態(tài),掛入到等待隊(duì)列。

classLock{int value = 0;

}

Lock::Acquire(){int key = 1;while(1 ==key){

exchange(lock, key);

}

}

Lock::Reease(){

value= 0;

}//本質(zhì)上就是用一個(gè)機(jī)器指令完成以下操作1、讀取當(dāng)前值。2、把當(dāng)前值對(duì)應(yīng)的內(nèi)存設(shè)置為1。

二、自旋鎖和互斥鎖的區(qū)別

互斥鎖:線程會(huì)從sleep(加鎖)——>running(解鎖),過(guò)程中有上下文的切換,cpu的搶占,信號(hào)的發(fā)送等開(kāi)銷;

自旋鎖:線程一直是running(加鎖——>解鎖),死循環(huán)檢測(cè)鎖的標(biāo)志位,機(jī)制不復(fù)雜,主要用于SMP和內(nèi)核可搶占下,因?yàn)樵趦?nèi)核不可搶占下,cpu在執(zhí)行空操作。

互斥鎖的起始原始開(kāi)銷要高于自旋鎖,但是基本是一勞永逸,臨界區(qū)持鎖時(shí)間的大小并不會(huì)對(duì)互斥鎖的開(kāi)銷造成影響,而自旋鎖是死循環(huán)檢測(cè),加鎖全程消耗cpu,起始開(kāi)銷雖然低于互斥鎖,但是隨著持鎖時(shí)間,加鎖的開(kāi)銷是線性增長(zhǎng)

三、自旋鎖和互斥鎖的對(duì)應(yīng)的應(yīng)用

互斥鎖用于臨界區(qū)持鎖時(shí)間比較長(zhǎng)的操作,比如下面這些情況都可以考慮

1、 臨界區(qū)有IO操作

2 、臨界區(qū)代碼復(fù)雜或者循環(huán)量大

3 、臨界區(qū)競(jìng)爭(zhēng)非常激烈

4、 單核處理器

至于自旋鎖就主要用在臨界區(qū)持鎖時(shí)間非常短且CPU資源不緊張的情況下。

自旋-互斥鎖

下面的英文介紹了混合互斥鎖和混合自旋鎖,但是不管是第一段說(shuō)的先上非阻塞鎖后上阻塞鎖,還是第二段說(shuō)的先自旋上鎖后進(jìn)行休眠,反正思路都是先自旋上鎖一定時(shí)間后在上互斥鎖,這種自旋-互斥鎖適合各線程持鎖時(shí)間間隔跨度比較大的情況。

A hybrid mutex behaves like a spinlock at first on a multi-core system. If a thread cannot lock the mutex, it won't be put to sleep immediately, since the mutex might get unlocked pretty soon, so instead the mutex will first behave exactly like a spinlock. Only if the lock has still not been obtained after a certain amount of time (or retries or any other measuring factor), the thread is really put to sleep. If the same system runs on a system with only a single core, the mutex will not spinlock, though, as, see above, that would not be beneficial.

A hybrid spinlock behaves like a normal spinlock at first, but to avoid wasting too much CPU time, it may have a back-off strategy. It will usually not put the thread to sleep (since you don't want that to happen when using a spinlock), but it may decide to stop the thread (either immediately or after a certain amount of time) and allow another thread to run, thus increasing chances that the spinlock is unlocked (a pure thread switch is usually less expensive than one that involves putting a thread to sleep and waking it up again later on, though not by far).

總結(jié)

以上是生活随笔為你收集整理的自旋锁和互斥锁实例_自旋锁和互斥锁的实现以及使用区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。