中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

手機(jī)app微信網(wǎng)站建設(shè)磁力狗在線搜索

手機(jī)app微信網(wǎng)站建設(shè),磁力狗在線搜索,溫州網(wǎng)吧什么時(shí)候恢復(fù)營(yíng)業(yè),客服平臺(tái)在線死鎖檢測(cè)組件-設(shè)想 現(xiàn)在有三個(gè)臨界資源和三把鎖綁定了,三把鎖又分別被三個(gè)線程占用。(不用關(guān)注臨界資源,因?yàn)殒i和臨界資源是綁定的) 但現(xiàn)在出現(xiàn)這種情況:線程1去申請(qǐng)獲取鎖2,線程2申請(qǐng)獲取鎖3,…

死鎖檢測(cè)組件-設(shè)想

現(xiàn)在有三個(gè)臨界資源和三把鎖綁定了,三把鎖又分別被三個(gè)線程占用。(不用關(guān)注臨界資源,因?yàn)殒i和臨界資源是綁定的)

20230217203523

但現(xiàn)在出現(xiàn)這種情況:線程1去申請(qǐng)獲取鎖2,線程2申請(qǐng)獲取鎖3,線程3申請(qǐng)獲取鎖1,這樣就會(huì)造成死鎖:

20230215224714

死鎖問(wèn)題,可轉(zhuǎn)換為有向圖的環(huán)路檢測(cè)

死鎖的構(gòu)建

有四個(gè)線程,4把鎖,以下代碼一定會(huì)產(chǎn)生死鎖


pthread_mutex_t mtx1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx3 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx4 = PTHREAD_MUTEX_INITIALIZER;void *thread_routine_a(void *arg) {printf("thread_routine a \n");pthread_mutex_lock(&mtx1);sleep(1);	pthread_mutex_lock(&mtx2);pthread_mutex_unlock(&mtx2);pthread_mutex_unlock(&mtx1);printf("thread_routine a exit\n");}void *thread_routine_b(void *arg) {printf("thread_routine b \n");pthread_mutex_lock(&mtx2);sleep(1);pthread_mutex_lock(&mtx3);pthread_mutex_unlock(&mtx3);pthread_mutex_unlock(&mtx2);printf("thread_routine b exit \n");
// -----pthread_mutex_lock(&mtx1);
}void *thread_routine_c(void *arg) {printf("thread_routine c \n");pthread_mutex_lock(&mtx3);sleep(1);pthread_mutex_lock(&mtx4);pthread_mutex_unlock(&mtx4);pthread_mutex_unlock(&mtx3);printf("thread_routine c exit \n");
}void *thread_routine_d(void *arg) {printf("thread_routine d \n");pthread_mutex_lock(&mtx4);sleep(1);pthread_mutex_lock(&mtx1);pthread_mutex_unlock(&mtx1);pthread_mutex_unlock(&mtx4);printf("thread_routine d exit \n");
}int main() {
#if 1init_hook();pthread_t tid1, tid2, tid3, tid4;pthread_create(&tid1, NULL, thread_routine_a, NULL);pthread_create(&tid2, NULL, thread_routine_b, NULL);pthread_create(&tid3, NULL, thread_routine_c, NULL);pthread_create(&tid4, NULL, thread_routine_d, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_join(tid3, NULL);pthread_join(tid4, NULL);
}

這里產(chǎn)生了:線程a => 線程b => 線程c => 線程d =》 線程a的這樣一個(gè)環(huán)路

但是我們不知道哪把鎖被哪個(gè)線程占用了,沒(méi)法構(gòu)建有向圖,也就無(wú)法得知是否產(chǎn)生了這樣一個(gè)環(huán)路

這時(shí),可以用hook,調(diào)自己寫的 pthread_mutex_lock,將線程和鎖的映射關(guān)系保存起來(lái)

pthread的hook

有點(diǎn)像裝飾器模式

// 函數(shù)指針
typedef int (*pthread_mutex_lock_t)(pthread_mutex_t *mutex);
pthread_mutex_lock_t pthread_mutex_lock_f;typedef int (*pthread_mutex_unlock_t)(pthread_mutex_t *mutex);
pthread_mutex_unlock_t pthread_mutex_unlock_f;static int init_hook() {//  RTLD_NEXT可以理解為代碼段,在這里面找pthread_mutex_lock函數(shù)名,把地址返回// 所以pthread_mutex_lock_f就是靜態(tài)或動(dòng)態(tài)庫(kù)里的pthread_mutex_lock鎖函數(shù)  pthread_mutex_lock_f = dlsym(RTLD_NEXT, "pthread_mutex_lock"); pthread_mutex_unlock_f = dlsym(RTLD_NEXT, "pthread_mutex_unlock");
}int pthread_mutex_lock(pthread_mutex_t *mutex) {printf("pthread_mutex_lock selfid %ld, mutex: %p\n", pthread_self(), mutex);beforelock(pthread_self(), mutex);pthread_mutex_lock_f(mutex);    // 用鉤子的好處,給系統(tǒng)函數(shù)命一個(gè)別名afterlock(pthread_self(), mutex);}int pthread_mutex_unlock(pthread_mutex_t *mutex) {printf("pthread_mutex_unlock\n");pthread_mutex_unlock_f(mutex);afterunlock(pthread_self(), mutex);}

這樣,在加鎖的時(shí)候,就能知道鎖id(mutex)和線程id的對(duì)應(yīng)關(guān)系

圖的構(gòu)建

通過(guò)鄰接表實(shí)現(xiàn)有向圖,如:線程1等待線程2釋放鎖,則將線程id2掛到線程1后面

20230216225923

而如何知道線程1申請(qǐng)的鎖被線程2占用了呢:設(shè)置一個(gè) mutex 和 thread的映射列表(結(jié)構(gòu)體數(shù)組),通過(guò)mutex返回threadid。

如線程1對(duì)mutex1加鎖,將(mutex1,threadid1)加入locklist中,表示mutex1被線程1占用了

圖的鄰接表生成:當(dāng)前線程根據(jù)要申請(qǐng)的mutex a找到占用這把鎖的線程id A(通過(guò)映射列表),將改線程追加到自己的后面

通過(guò)鄰接表檢測(cè)環(huán)路:DFS,檢測(cè)過(guò)的標(biāo)為1,再遇到一個(gè)1就表示死鎖了

20230216230719

那我們?cè)趺窗堰@個(gè)圖構(gòu)建起來(lái): 通過(guò)三個(gè)原語(yǔ)操作
beforelock、afterlock、afterrunlock 以后要用到再說(shuō)吧

至此,死鎖檢測(cè)組件設(shè)計(jì)的大致思路為:通過(guò)hook保存muitex和threadid的映射關(guān)系,根據(jù)這個(gè)映射關(guān)系生成線程之間的有向圖(鄰接表),再利用dfs檢測(cè)圖的環(huán)路

http://www.risenshineclean.com/news/62948.html

相關(guān)文章:

  • 自己做的網(wǎng)站如何上傳百度電話銷售
  • 表白網(wǎng)站制作平臺(tái)百度信息流投放
  • 垃圾網(wǎng)站信息怎么辦朋友圈營(yíng)銷廣告
  • 東莞網(wǎng)站優(yōu)化怎樣百度最新秒收錄方法2021
  • 番禺做網(wǎng)站企業(yè)1688seo優(yōu)化是什么
  • 自己做網(wǎng)站空間百度搜索廣告
  • wordpress自適應(yīng)導(dǎo)航模板seo的基本步驟
  • 單位網(wǎng)里建網(wǎng)站培訓(xùn)心得體會(huì)總結(jié)
  • 微信營(yíng)銷 網(wǎng)站建設(shè)關(guān)鍵詞排名手機(jī)優(yōu)化軟件
  • u盤搭建網(wǎng)站開發(fā)環(huán)境方法線上推廣方式都有哪些
  • 騰云建站靠譜嗎seo是指什么崗位
  • 合肥網(wǎng)站制作軟件湖南網(wǎng)站建設(shè)效果
  • 國(guó)外優(yōu)秀的平面設(shè)計(jì)網(wǎng)站seo系統(tǒng)培訓(xùn)
  • 門頭溝富陽(yáng)網(wǎng)站建設(shè)網(wǎng)絡(luò)營(yíng)銷的發(fā)展現(xiàn)狀如何
  • 企業(yè)咨詢師資格證百度seo 優(yōu)化
  • 高陵微網(wǎng)站建設(shè)網(wǎng)絡(luò)服務(wù)器地址怎么查
  • 河北網(wǎng)站建設(shè)團(tuán)隊(duì)如何建立網(wǎng)站 個(gè)人
  • 如何在自己電腦上做網(wǎng)站服務(wù)器夜狼seo
  • 武漢h5網(wǎng)站建設(shè)百度一下app下載安裝
  • 網(wǎng)站制作流程有哪些一站式網(wǎng)絡(luò)營(yíng)銷
  • 建e網(wǎng)模型官網(wǎng)seo快速排名培訓(xùn)
  • 公司建設(shè)官方網(wǎng)站需要多少錢做運(yùn)營(yíng)的具體做什么
  • ps海報(bào)素材網(wǎng)站先做后付費(fèi)的代運(yùn)營(yíng)
  • 做二手車的網(wǎng)站有哪些外貿(mào)營(yíng)銷網(wǎng)站
  • wordpress表白模板下載seo推廣平臺(tái)
  • 中國(guó)flash網(wǎng)站模板中心西安百度推廣優(yōu)化
  • apple開發(fā)者中心商品標(biāo)題seo是什么意思
  • 酷炫網(wǎng)站模板抖音seo供應(yīng)商
  • b站做簡(jiǎn)介的網(wǎng)站中央電視臺(tái)一套廣告價(jià)目表
  • DW做旅游網(wǎng)站畢業(yè)設(shè)計(jì)精準(zhǔn)網(wǎng)絡(luò)推廣