mutex的加锁与解锁问题
問(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)題。
- 上一篇: 2020年餐饮B2B服务产业创新报告
- 下一篇: 深入理解pthread_cond_wai