mutex的加锁与解锁问题
問題:
有一個進程,創(chuàng)建了2個線程,線程A和線程B,線程A與線程B都需要訪問某一資源。
所以在進程中初始化了一個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平時讀消息隊列,收到消息后執(zhí)行一次如下操作:
pthread_mutex_lock(&resMutex);
use?resource
pthread_mutex_unlock(&resMutex);
?
發(fā)現(xiàn)執(zhí)行情況:
???線程A?lock?mutex
???線程A?訪問資源
???線程B?lock?mutex?阻塞
???線程A?unlock?mutex
???線程A?lock?mutex
???線程A?訪問資源
???線程A?unlock?mutex
???...
???線程A的工作執(zhí)行完,最后一次unlock?mutex
???線程B?lock?mutex?成功返回
???線程B?訪問資源
???線程B?unlock?mutex
?
就是線程A工作時,線程B一直搶占不到mutex。
查了下手冊,默認的mutex類型應(yīng)該是PTHREAD_MUTEX_TIMED_NP,按手冊來說,這種鎖當一個線程加鎖以后,其余請求鎖的線程將形成一個等待隊列,并在解鎖后按優(yōu)先級獲得鎖。
線程A加鎖后,只有線程B請求鎖,那么為什么線程A解鎖后,線程B并沒有馬上得到鎖,而是線程A下一循環(huán)周期的加鎖請求又得到鎖了呢?
?
然后我嘗試了一下,在線程A解鎖后加了一點延時,線程B就能夠在線程A本周期解鎖后得到鎖了。
?
A線程持續(xù)持有資源
求解
?
?
?
?
?
?
理解解釋:
?
?服務(wù)器死了?又得重寫一遍。。
自己實驗了下?當i==10000的時候才會出現(xiàn)明顯的線程切換現(xiàn)象。
?
猜想:?
??當A線程放棄資源之前,會告訴內(nèi)核,然后內(nèi)核查看申請隊列。如果是空,就繼續(xù)讓A持有資源。
???如果有線程申請該資源,A線程會放棄該資源。但這是個漫長的過程。
???因此在這個過程中,A繼續(xù)能獲得B資源。
?
當過了N年之后,線程B知道了??,A資源已經(jīng)跟A線程分離了?才能趁虛而入。
?
線程調(diào)度基本上有兩種?1是先來先服務(wù)?2是優(yōu)先級高的先服務(wù)。明顯這里?用的是先來先服務(wù)。?但是B線程一直沒有得到內(nèi)核發(fā)出的A資源已經(jīng)可以被使用的信號。所以A資源占了點便宜。能夠繼續(xù)占有資源。??cpu處理跟IO設(shè)備的時間差,才是操作系統(tǒng)存在的根本原因。時間差是王道啊。
?
?
?
我的理解:
A設(shè)備解鎖,內(nèi)核發(fā)布告訴申請這個資源的線程們,這個資源可以搶了.原則:先來先服務(wù).
然后A/B開始搶資源,資源A設(shè)備剛用完,還在A設(shè)備手上.所以A設(shè)備立即搶,時間花費極小;
但是B從收到搶的信號到開始搶,需要花費一定的時間,肯定搶不過A設(shè)備的.
所以A理所當然的把資源搶到了,然后加鎖,內(nèi)核就宣布本回合結(jié)束.資源被A設(shè)備搶到,A設(shè)備可以用,其他設(shè)備等待.
所以B就不搶了,繼續(xù)等待如此循環(huán)下去了….所以A一直占用資源,B一直搶不到.
?
來自 <https://bbs.csdn.net/topics/360180262>
總結(jié)
以上是生活随笔為你收集整理的mutex的加锁与解锁问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年餐饮B2B服务产业创新报告
- 下一篇: 深入理解pthread_cond_wai