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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习之系统编程篇:死锁的情形及其解决

發布時間:2024/9/30 linux 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习之系统编程篇:死锁的情形及其解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(1)自己鎖自己(自己重復加同一個鎖)
解決:上鎖,自己操作完成后,一定要解鎖 lock 和 unlock 成對出現
舉例:

for(int i = 0; i < MAX; i++) { // 加鎖pthread_mutex_lock(&mutex); // 第一次循環,沒解鎖,第二次循環,執行至此,由于發現有鎖,因此阻塞代碼……// 沒有解鎖 }

對于此處內核設計的思考:
鎖的類型 pthread_mutex_t 本質上是一個結構體。這個結構體中會有一個成員屬性(假設是flag),用于判斷是否上鎖,int型,其值是0或者1,1代表有一把鎖可用,意味著沒鎖,而0代表有鎖,當某線程執行到pthread_mutex_lock,內核會通過 flag 判斷是否上鎖,只要是上鎖狀態,所有線程都會被組設,因為在設計時候就決定了,它只關心是否上鎖,而不會關心是誰上的鎖,因此會出現自己鎖住自己的現象。
試想:在設計的時候,在結構體中,增加一個屬性,用于判斷是哪個線程上的鎖,執行到pthread_mutex_lock,先判斷是否上鎖,如果上鎖,再判斷是否是我上的鎖,這樣就將“普通鎖”變為“指紋鎖”,就可以避免自己鎖住自己的情況了。
(2)多個共享數據,多個鎖,某些情況下,可能會造成死鎖。

如上圖所示,就會造成“線程 1 阻塞在 B 鎖”和“線程 2 阻塞在 A 鎖”的現象。
解決:
方式 1:造成這總的死鎖的原因是線程訪問順序不一樣:
線程 1 :A->B ;
線程 2 :B->A
因此:讓線程按照一定的順序去訪問共享資源。
方式 2:在訪問其他鎖的時候,需要先將自己的鎖解開。
方式 3:使用 trylock。

總結

以上是生活随笔為你收集整理的Linux学习之系统编程篇:死锁的情形及其解决的全部內容,希望文章能夠幫你解決所遇到的問題。

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