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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mutex的加锁与解锁问题

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的加锁与解锁问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。