国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > Linux服務器 > 正文

Linux線程退出方式總結(推薦)

2024-09-05 23:03:27
字體:
來源:轉載
供稿:網友

在編寫多線程代碼時,經常面臨線程安全退出的問題。

一般情況下,選擇檢查標志位的方式:

在線程的while循環中,執行完例程后,都對標志位進行檢查,如果標志位指示繼續執行則再次執行例程,如果標志位設置為退出狀態,則跳出循環,結束線程的運行。

這個標志位需要主線程(或其他線程)設置,設置后,主線程調用pthread_join接口進入休眠(接口參數指定了等待的線程控制指針),子線程退出后,主線程會接收到系統的信號,從休眠中恢復,這個時候就可以去做相關的資源清除動作。

這個方法可以保證子線程完全退出,主線程再去做相關的資源清除操作

時序圖如下

linux,線程退出

但是某些應用中,或許會發生下面情況:

子線程阻塞在某個操作無法被喚醒,即使主線程設置了標志位,由于子線程進入了休眠無法醒過來,也沒有辦法去檢查標志位,這個時候調用pthread_join進入休眠的主線程等待不到子線程退出的信號,也會一直休眠,系統進入死鎖。

為了更安全地使線程退出,主線程通過pthread_cancel函數來請求取消同一進程中的其他線程,再調用pthread_join等待指定線程退出。使用pthread_cancel接口,需要了解Linux下線程的兩個屬性,可取消狀態和可取消類型,以及取消點的概念。

可取消狀態:包括PTHREAD_CANCEL_ENABLE和PTHREAD_CANCEL_DISABLE。當線程處于PTHREAD_CANCEL_ENABLE,收到cancel請求會使該線程退出運行;反之,若處于PTHREAD_CANCEL_DISABLE,收到的cancel請求將處于未決狀態,線程不會退出。線程啟動時的默認可取消狀態為PTHREAD_CANCEL_ENABLE,可以通過接口pthread_setcancelstate改變可取消狀態的屬性。

可取消類型:包括PTHREAD_CANCEL_DEFERRED和PTHREAD_CANCEL_ASYNCHRONOUS。當處于PTHREAD_CANCEL_DEFERRED,線程在收到cancel請求后,需要運行到取消點才能退出運行;如果處于PTHREAD_CANCEL_ASYNCHRONOUS,可以在任意時間取消,只要收到cancel請求即可馬上退出。線程啟動時默認可取消類型為PTHREAD_CANCEL_DEFERRED,可通過pthread_setcanceltype修改可取消類型。

取消點:線程檢查是否被取消并按照請求進行動作的一個位置。

采用PTHREAD_CANCEL_DEFERRED取消方式是因為線程可能在獲取臨界資源后(如獲取鎖),未釋放資源前收到退出信號,如果使用PTHREAD_CANCEL_ ASYNCHRONOUS的方式,無論線程運行到哪個位置,都會馬上退出,而占有的資源卻得不到釋放。

采用PTHREAD_CANCEL_DEFERRED取消方式,線程需要運行到取消點才退出,而主線程在調用pthread_cancel后,不能馬上進行線程資源釋放,必須調用pthread_join進入休眠,直至等待指定線程退出。

使用PTHREAD_CANCEL_DEFERRED方式并不能完全避免這個問題,因為無法保證在獲取臨界資源后(比如lock操作)不會進行可以作為取消點的操作(如進行sleep),此時主線程如果對該線程發送cancel信號,線程將會在不釋放鎖的情況下直接結束運行,即還是會出現在釋放資源前線程就退出的問題。

為了避免上述情況,不僅需要設置可取消類型,還需要設置可取消狀態。將獲取臨界資源-釋放臨界資源之間的代碼塊都設置成PTHREAD_CANCEL_DISABLE狀態,其余的代碼塊都設置成PTHREAD_CANCEL_ENABLE狀態,確保線程在安全的地方退出。如果在可以安全退出的代碼塊不存在取消點系統調用,可以調用pthread_testcancel函數自己添加取消點。

偽代碼描述如下:

void* subThread(void*){  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldCancleState);  …;//不存在獲取臨界資源操作,可以安全退出的代碼塊  pthread_testcancel();//如果可以安全退出的代碼塊不存在取消點操作,可以自己添加pthread_testcancel調用,線程執行到這個調用就會退出  /*還有一種方法,在可以安全退出的代碼塊,我們將線程的可取消類型設置成PTHREAD_CANCEL_ ASYNCHRONOUS,這樣即使沒有取消點也可以馬上退出*/  pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldCancleState);  /*存在獲取-釋放臨界資源操作,如果在lock和unlock之間的運行收到cancel信號,且可取消狀態為enable,則鎖永遠無法被釋放*/  Lock();  …;  Unlock();}void* mainThread(void*){  pthread_cancel(subThread);//給subThread發送退出信號  pthread_join(subThread,null);//進入休眠,直到subThread退出成功}

無論使用哪種方式,核心點就是要保證線程退出的時候不會獲取了某些臨界資源而無法釋放

POSIX.1定義的取消點見下:
linux,線程退出
linux,線程退出

注意:當主線程調用pthread_cancel接口后,只是將取消請求發送給指定線程,
對接口的成功調用不能保證指定線程已經退出,需要調用pthread_join等待指定線程完全退出,再進行相關資源的釋放。

以上就是小編為大家帶來的Linux線程退出方式總結(推薦)全部內容了,希望大家多多支持VEVB武林網~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 朔州市| 喜德县| 漾濞| 饶河县| 赤水市| 旺苍县| 凭祥市| 珠海市| 石门县| 调兵山市| 红桥区| 尼玛县| 科技| 乐清市| 墨江| 宝丰县| 札达县| 乌鲁木齐县| 天水市| 景泰县| 九寨沟县| 彰化市| 瑞安市| 彩票| 富源县| 安庆市| 阿瓦提县| 共和县| 房产| 淳化县| 蒲城县| 铜鼓县| 平昌县| 绩溪县| 老河口市| 攀枝花市| 天门市| 科技| 奉贤区| 简阳市| 驻马店市|