最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年01月05日 09:46:28   投稿:jingxian  
下面小編就為大家?guī)硪黄狶inux線程退出方式總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

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

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

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

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

時(shí)序圖如下

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

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

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

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

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

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

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

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

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

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

偽代碼描述如下:

void* subThread(void*)
{
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldCancleState);
  …;//不存在獲取臨界資源操作,可以安全退出的代碼塊
  pthread_testcancel();//如果可以安全退出的代碼塊不存在取消點(diǎn)操作,可以自己添加pthread_testcancel調(diào)用,線程執(zhí)行到這個(gè)調(diào)用就會(huì)退出
  /*還有一種方法,在可以安全退出的代碼塊,我們將線程的可取消類型設(shè)置成PTHREAD_CANCEL_ ASYNCHRONOUS,這樣即使沒有取消點(diǎn)也可以馬上退出*/

  pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldCancleState);
  /*存在獲取-釋放臨界資源操作,如果在lock和unlock之間的運(yùn)行收到cancel信號(hào),且可取消狀態(tài)為enable,則鎖永遠(yuǎn)無法被釋放*/
  Lock();
  …;
  Unlock();
}

void* mainThread(void*)
{
  pthread_cancel(subThread);//給subThread發(fā)送退出信號(hào)
  pthread_join(subThread,null);//進(jìn)入休眠,直到subThread退出成功
}

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

POSIX.1定義的取消點(diǎn)見下:

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

以上就是小編為大家?guī)淼腖inux線程退出方式總結(jié)(推薦)全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • 詳解ubuntu下安裝Docker

    詳解ubuntu下安裝Docker

    本篇文章主要介紹了ubuntu下安裝Docker,詳細(xì)的介紹了安裝Docker的情況,具有一定的參考價(jià)值,有需要的一起來了解一下。
    2016-12-12
  • RHE5服務(wù)器配置-搭建Samba服務(wù)器步驟(圖)

    RHE5服務(wù)器配置-搭建Samba服務(wù)器步驟(圖)

    Samba的核心是兩個(gè)守護(hù)進(jìn)程,即smbd和nmbd。服務(wù)器啟動(dòng)到停止期間持續(xù)運(yùn)行,smba監(jiān)聽139TCP端口;nmbd監(jiān)聽137和138UDP端口
    2013-02-02
  • linux查看防火墻狀態(tài)與開啟關(guān)閉命令詳解

    linux查看防火墻狀態(tài)與開啟關(guān)閉命令詳解

    linux查看防火墻狀態(tài)與開啟關(guān)閉命令常用的有以下兩種方式,大家可以參考一下
    2018-03-03
  • 詳解Linux文本文件與WIN文本文件換行格式轉(zhuǎn)換命令

    詳解Linux文本文件與WIN文本文件換行格式轉(zhuǎn)換命令

    這篇文章主要介紹了詳解Linux文本文件與WIN文本文件換行格式轉(zhuǎn)換命令的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • linux系統(tǒng)的初始化配置淺析

    linux系統(tǒng)的初始化配置淺析

    本文給大家介紹linux系統(tǒng)的初始化配置,涉及到網(wǎng)絡(luò)的初始化,主機(jī)名的修改,關(guān)閉firewalld和selinux的方法等知識(shí)點(diǎn),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-10-10
  • 讓apache也支持asp環(huán)境的方法

    讓apache也支持asp環(huán)境的方法

    由于apache和php合作好,各方法都優(yōu)于asp在apache上的運(yùn)行所以默認(rèn)的apache是沒有這個(gè)模塊的,相 關(guān)的教程也少,我們要想讓apache可運(yùn)行asp只要加載mod_aspdotnet-2.2.0.2006-setup-r2.msi這個(gè)模塊就好了
    2014-05-05
  • linux使用find和crontab命令定期清理過期文件

    linux使用find和crontab命令定期清理過期文件

    這篇文章主要給大家介紹了linux系統(tǒng)下使用find和crontab命令定期清理過期文件的方法,文中先對(duì)find和crontab命令進(jìn)行了詳細(xì)的介紹,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,下面來一起看看吧。
    2016-12-12
  • centOS7.4 安裝 mysql 5.7.26的教程詳解

    centOS7.4 安裝 mysql 5.7.26的教程詳解

    CentOS中默認(rèn)安裝有MariaDB,這個(gè)是MySQL的分支,但為了需要,還是要在系統(tǒng)中安裝MySQL,而且安裝完成之后可以直接覆蓋掉MariaDB。這篇文章主要介紹了centOS7.4 安裝 mysql 5.7.26,需要的朋友可以參考下
    2019-06-06
  • 詳解CentOS7安裝配置vsftp搭建FTP

    詳解CentOS7安裝配置vsftp搭建FTP

    這篇文章主要介紹了詳解CentOS7安裝配置vsftp搭建FTP,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • 如何解決Too many levels of symbolic links的問題

    如何解決Too many levels of symbolic lin

    這篇文章主要介紹了如何解決Too many levels of symbolic links的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論

临海市| 休宁县| 富裕县| 和政县| 罗山县| 雷山县| 岳普湖县| 阳信县| 徐汇区| 孝感市| 安泽县| 民和| 汝阳县| 汉寿县| 武汉市| 嘉定区| 木里| 蓬莱市| 岫岩| 科尔| 丹阳市| 武安市| 政和县| 丁青县| 海城市| 嘉黎县| 肃北| 无锡市| 枣庄市| 连平县| 皮山县| 行唐县| 满洲里市| 柘荣县| 汾西县| 常山县| 甘南县| 牡丹江市| 漯河市| 汉中市| 鄯善县|