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

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

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

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

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

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

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

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

時序圖如下

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

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

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

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

可取消類型:包括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),此時主線程如果對該線程發(fā)送cancel信號,線程將會在不釋放鎖的情況下直接結束運行,即還是會出現在釋放資源前線程就退出的問題。

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

偽代碼描述如下:

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

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

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

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

POSIX.1定義的取消點見下:

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

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

相關文章

  • 詳解ubuntu下安裝Docker

    詳解ubuntu下安裝Docker

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

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

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

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

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

    詳解Linux文本文件與WIN文本文件換行格式轉換命令

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

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

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

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

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

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

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

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

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

    詳解CentOS7安裝配置vsftp搭建FTP

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

    如何解決Too many levels of symbolic lin

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

最新評論

额尔古纳市| 宜春市| 汝州市| 益阳市| 麦盖提县| 江陵县| 八宿县| 同江市| 崇义县| 禹州市| 饶河县| 西城区| 镇坪县| 凌源市| 武邑县| 皋兰县| 阿瓦提县| 五指山市| 珠海市| 邯郸市| 自贡市| 黎城县| 科尔| 崇州市| 观塘区| 于都县| 汝阳县| 宾阳县| 类乌齐县| 周口市| 九龙城区| 密山市| 辛集市| 黑水县| 措勤县| 灯塔市| 都兰县| 古交市| 河北省| 道孚县| 海丰县|