一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

Linux|Centos|Ubuntu|系統(tǒng)進(jìn)程|Fedora|注冊(cè)表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務(wù)器之家 - 服務(wù)器系統(tǒng) - Linux - Linux線(xiàn)程退出方式總結(jié)(推薦)

Linux線(xiàn)程退出方式總結(jié)(推薦)

2021-12-20 16:44Linux教程網(wǎng) Linux

下面小編就為大家?guī)?lái)一篇Linux線(xiàn)程退出方式總結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在編寫(xiě)多線(xiàn)程代碼時(shí),經(jīng)常面臨線(xiàn)程安全退出的問(wèn)題。

一般情況下,選擇檢查標(biāo)志位的方式:

在線(xiàn)程的while循環(huán)中,執(zhí)行完例程后,都對(duì)標(biāo)志位進(jìn)行檢查,如果標(biāo)志位指示繼續(xù)執(zhí)行則再次執(zhí)行例程,如果標(biāo)志位設(shè)置為退出狀態(tài),則跳出循環(huán),結(jié)束線(xiàn)程的運(yùn)行。

這個(gè)標(biāo)志位需要主線(xiàn)程(或其他線(xiàn)程)設(shè)置,設(shè)置后,主線(xiàn)程調(diào)用pthread_join接口進(jìn)入休眠(接口參數(shù)指定了等待的線(xiàn)程控制指針),子線(xiàn)程退出后,主線(xiàn)程會(huì)接收到系統(tǒng)的信號(hào),從休眠中恢復(fù),這個(gè)時(shí)候就可以去做相關(guān)的資源清除動(dòng)作。

這個(gè)方法可以保證子線(xiàn)程完全退出,主線(xiàn)程再去做相關(guān)的資源清除操作

時(shí)序圖如下

Linux線(xiàn)程退出方式總結(jié)(推薦)

但是某些應(yīng)用中,或許會(huì)發(fā)生下面情況:

子線(xiàn)程阻塞在某個(gè)操作無(wú)法被喚醒,即使主線(xiàn)程設(shè)置了標(biāo)志位,由于子線(xiàn)程進(jìn)入了休眠無(wú)法醒過(guò)來(lái),也沒(méi)有辦法去檢查標(biāo)志位,這個(gè)時(shí)候調(diào)用pthread_join進(jìn)入休眠的主線(xiàn)程等待不到子線(xiàn)程退出的信號(hào),也會(huì)一直休眠,系統(tǒng)進(jìn)入死鎖。

為了更安全地使線(xiàn)程退出,主線(xiàn)程通過(guò)pthread_cancel函數(shù)來(lái)請(qǐng)求取消同一進(jìn)程中的其他線(xiàn)程,再調(diào)用pthread_join等待指定線(xiàn)程退出。使用pthread_cancel接口,需要了解linux下線(xiàn)程的兩個(gè)屬性,可取消狀態(tài)和可取消類(lèi)型,以及取消點(diǎn)的概念。

可取消狀態(tài):包括pthread_cancel_enable和pthread_cancel_disable。當(dāng)線(xiàn)程處于pthread_cancel_enable,收到cancel請(qǐng)求會(huì)使該線(xiàn)程退出運(yùn)行;反之,若處于pthread_cancel_disable,收到的cancel請(qǐng)求將處于未決狀態(tài),線(xiàn)程不會(huì)退出。線(xiàn)程啟動(dòng)時(shí)的默認(rèn)可取消狀態(tài)為pthread_cancel_enable,可以通過(guò)接口pthread_setcancelstate改變可取消狀態(tài)的屬性。

可取消類(lèi)型:包括pthread_cancel_deferred和pthread_cancel_asynchronous。當(dāng)處于pthread_cancel_deferred,線(xiàn)程在收到cancel請(qǐng)求后,需要運(yùn)行到取消點(diǎn)才能退出運(yùn)行;如果處于pthread_cancel_asynchronous,可以在任意時(shí)間取消,只要收到cancel請(qǐng)求即可馬上退出。線(xiàn)程啟動(dòng)時(shí)默認(rèn)可取消類(lèi)型為pthread_cancel_deferred,可通過(guò)pthread_setcanceltype修改可取消類(lèi)型。

取消點(diǎn):線(xiàn)程檢查是否被取消并按照請(qǐng)求進(jìn)行動(dòng)作的一個(gè)位置。

采用pthread_cancel_deferred取消方式是因?yàn)榫€(xiàn)程可能在獲取臨界資源后(如獲取鎖),未釋放資源前收到退出信號(hào),如果使用pthread_cancel_ asynchronous的方式,無(wú)論線(xiàn)程運(yùn)行到哪個(gè)位置,都會(huì)馬上退出,而占有的資源卻得不到釋放。

采用pthread_cancel_deferred取消方式,線(xiàn)程需要運(yùn)行到取消點(diǎn)才退出,而主線(xiàn)程在調(diào)用pthread_cancel后,不能馬上進(jìn)行線(xiàn)程資源釋放,必須調(diào)用pthread_join進(jìn)入休眠,直至等待指定線(xiàn)程退出。

使用pthread_cancel_deferred方式并不能完全避免這個(gè)問(wèn)題,因?yàn)闊o(wú)法保證在獲取臨界資源后(比如lock操作)不會(huì)進(jìn)行可以作為取消點(diǎn)的操作(如進(jìn)行sleep),此時(shí)主線(xiàn)程如果對(duì)該線(xiàn)程發(fā)送cancel信號(hào),線(xiàn)程將會(huì)在不釋放鎖的情況下直接結(jié)束運(yùn)行,即還是會(huì)出現(xiàn)在釋放資源前線(xiàn)程就退出的問(wèn)題。

為了避免上述情況,不僅需要設(shè)置可取消類(lèi)型,還需要設(shè)置可取消狀態(tài)。將獲取臨界資源-釋放臨界資源之間的代碼塊都設(shè)置成pthread_cancel_disable狀態(tài),其余的代碼塊都設(shè)置成pthread_cancel_enable狀態(tài),確保線(xiàn)程在安全的地方退出。如果在可以安全退出的代碼塊不存在取消點(diǎn)系統(tǒng)調(diào)用,可以調(diào)用pthread_testcancel函數(shù)自己添加取消點(diǎn)。

偽代碼描述如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void* subthread(void*)
{
  pthread_setcancelstate(pthread_cancel_enable,&oldcanclestate);
  …;//不存在獲取臨界資源操作,可以安全退出的代碼塊
  pthread_testcancel();//如果可以安全退出的代碼塊不存在取消點(diǎn)操作,可以自己添加pthread_testcancel調(diào)用,線(xiàn)程執(zhí)行到這個(gè)調(diào)用就會(huì)退出
  /*還有一種方法,在可以安全退出的代碼塊,我們將線(xiàn)程的可取消類(lèi)型設(shè)置成pthread_cancel_ asynchronous,這樣即使沒(méi)有取消點(diǎn)也可以馬上退出*/
 
  pthread_setcancelstate(pthread_cancel_disable,&oldcanclestate);
  /*存在獲取-釋放臨界資源操作,如果在lock和unlock之間的運(yùn)行收到cancel信號(hào),且可取消狀態(tài)為enable,則鎖永遠(yuǎn)無(wú)法被釋放*/
  lock();
  …;
  unlock();
}
 
void* mainthread(void*)
{
  pthread_cancel(subthread);//給subthread發(fā)送退出信號(hào)
  pthread_join(subthread,null);//進(jìn)入休眠,直到subthread退出成功
}

無(wú)論使用哪種方式,核心點(diǎn)就是要保證線(xiàn)程退出的時(shí)候不會(huì)獲取了某些臨界資源而無(wú)法釋放

posix.1定義的取消點(diǎn)見(jiàn)下:
Linux線(xiàn)程退出方式總結(jié)(推薦)
Linux線(xiàn)程退出方式總結(jié)(推薦)

注意:當(dāng)主線(xiàn)程調(diào)用pthread_cancel接口后,只是將取消請(qǐng)求發(fā)送給指定線(xiàn)程,
對(duì)接口的成功調(diào)用不能保證指定線(xiàn)程已經(jīng)退出,需要調(diào)用pthread_join等待指定線(xiàn)程完全退出,再進(jìn)行相關(guān)資源的釋放。

以上就是小編為大家?guī)?lái)的linux線(xiàn)程退出方式總結(jié)(推薦)全部?jī)?nèi)容了,希望大家多多支持服務(wù)器之家~

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 极致堕落(高h) | 免费港剧在线观看港剧 | 黑人异族日本人hd | 人配人种视频xxxx | 黑人群性xxx | 亚洲国产货青视觉盛宴 | 亚洲欧美国产自拍 | 调教催眠改造np总攻 | 国产婷婷综合丁香亚洲欧洲 | 欧美日韩国产精品综合 | 欧美特黄aaaaaa | 欧洲另类一二三四区 | 国产欧美国产综合第一区 | 青青草精品 | 美女把腿开让我 | 东方影视欧美天天影院 | 91精品国产美女福到在线不卡 | 欧美日韩亚洲高清不卡一区二区三区 | 午夜小视频免费观看 | 久久精品国产在热亚洲 | 国产在线精品成人一区二区三区 | 肉大捧一进一出视频免费播放 | 精品性影院一区二区三区内射 | 果冻传媒 天美 麻豆 | 精东影业传媒全部作品 | 日韩欧美在线观看综合网另类 | 国产精品亚洲精品日韩已方 | 亚洲 日韩经典 中文字幕 | 好男人资源在线观看免费的 | 国产成人精品曰本亚洲77美色 | 5g影院天天5g天天爽大陆 | 国产精品久久久久久影视 | 护士柔佳 | 日本高清免费不卡在线播放 | 久久久GOGO无码啪啪艺术 | 草莓视频榴莲视频 | 欧亚尺码专线欧洲s码wmy | 亚洲精品九色在线网站 | 五月天婷婷精品免费视频 | 99国产精品热久久久久久夜夜嗨 | 日韩一区二区在线视频 |