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