日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

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

生活随笔

當(dāng)前位置: 首頁(yè) >

mutex的加锁与解锁问题

發(fā)布時(shí)間:2025/3/15 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mutex的加锁与解锁问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題:

有一個(gè)進(jìn)程,創(chuàng)建了2個(gè)線程,線程A和線程B,線程A與線程B都需要訪問(wèn)某一資源。

所以在進(jìn)程中初始化了一個(gè)pthread_mutex_t變量resMutex;

pthread_mutex_init(&resMutex,?NULL);

?

線程A的工作:

for?(i=0;i<100;i++)

{

???pthread_mutex_lock(&resMutex);

???use?resource

???pthread_mutex_unlock(&resMutex);

}

?

線程B平時(shí)讀消息隊(duì)列,收到消息后執(zhí)行一次如下操作:

pthread_mutex_lock(&resMutex);

use?resource

pthread_mutex_unlock(&resMutex);

?

發(fā)現(xiàn)執(zhí)行情況:

???線程A?lock?mutex

???線程A?訪問(wèn)資源

???線程B?lock?mutex?阻塞

???線程A?unlock?mutex

???線程A?lock?mutex

???線程A?訪問(wèn)資源

???線程A?unlock?mutex

???...

???線程A的工作執(zhí)行完,最后一次unlock?mutex

???線程B?lock?mutex?成功返回

???線程B?訪問(wèn)資源

???線程B?unlock?mutex

?

就是線程A工作時(shí),線程B一直搶占不到mutex。

查了下手冊(cè),默認(rèn)的mutex類(lèi)型應(yīng)該是PTHREAD_MUTEX_TIMED_NP,按手冊(cè)來(lái)說(shuō),這種鎖當(dāng)一個(gè)線程加鎖以后,其余請(qǐng)求鎖的線程將形成一個(gè)等待隊(duì)列,并在解鎖后按優(yōu)先級(jí)獲得鎖。

線程A加鎖后,只有線程B請(qǐng)求鎖,那么為什么線程A解鎖后,線程B并沒(méi)有馬上得到鎖,而是線程A下一循環(huán)周期的加鎖請(qǐng)求又得到鎖了呢?

?

然后我嘗試了一下,在線程A解鎖后加了一點(diǎn)延時(shí),線程B就能夠在線程A本周期解鎖后得到鎖了。

?

A線程持續(xù)持有資源

求解

?

?

?

?

?

?

理解解釋:

?

?服務(wù)器死了?又得重寫(xiě)一遍。。

自己實(shí)驗(yàn)了下?當(dāng)i==10000的時(shí)候才會(huì)出現(xiàn)明顯的線程切換現(xiàn)象。

?

猜想:?

??當(dāng)A線程放棄資源之前,會(huì)告訴內(nèi)核,然后內(nèi)核查看申請(qǐng)隊(duì)列。如果是空,就繼續(xù)讓A持有資源。

???如果有線程申請(qǐng)?jiān)撡Y源,A線程會(huì)放棄該資源。但這是個(gè)漫長(zhǎng)的過(guò)程。

???因此在這個(gè)過(guò)程中,A繼續(xù)能獲得B資源。

?

當(dāng)過(guò)了N年之后,線程B知道了??,A資源已經(jīng)跟A線程分離了?才能趁虛而入。

?

線程調(diào)度基本上有兩種?1是先來(lái)先服務(wù)?2是優(yōu)先級(jí)高的先服務(wù)。明顯這里?用的是先來(lái)先服務(wù)。?但是B線程一直沒(méi)有得到內(nèi)核發(fā)出的A資源已經(jīng)可以被使用的信號(hào)。所以A資源占了點(diǎn)便宜。能夠繼續(xù)占有資源。??cpu處理跟IO設(shè)備的時(shí)間差,才是操作系統(tǒng)存在的根本原因。時(shí)間差是王道啊。

?

?

?

我的理解:

A設(shè)備解鎖,內(nèi)核發(fā)布告訴申請(qǐng)這個(gè)資源的線程們,這個(gè)資源可以搶了.原則:先來(lái)先服務(wù).

然后A/B開(kāi)始搶資源,資源A設(shè)備剛用完,還在A設(shè)備手上.所以A設(shè)備立即搶,時(shí)間花費(fèi)極小;

但是B從收到搶的信號(hào)到開(kāi)始搶,需要花費(fèi)一定的時(shí)間,肯定搶不過(guò)A設(shè)備的.

所以A理所當(dāng)然的把資源搶到了,然后加鎖,內(nèi)核就宣布本回合結(jié)束.資源被A設(shè)備搶到,A設(shè)備可以用,其他設(shè)備等待.

所以B就不搶了,繼續(xù)等待如此循環(huán)下去了….所以A一直占用資源,B一直搶不到.

?

來(lái)自 <https://bbs.csdn.net/topics/360180262>

總結(jié)

以上是生活随笔為你收集整理的mutex的加锁与解锁问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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