青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

桃源谷

心靈的旅行

人生就是一場(chǎng)旅行,不在乎旅行的目的地,在乎的是沿途的風(fēng)景和看風(fēng)景的心情 !
posts - 32, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
From 2008精選

原文地址:http://d.hatena.ne.jp/yupo5656/20040724/p1

[] UNIX上的C++程序設(shè)計(jì)守則 (4)Add star

鐵則4: 請(qǐng)不要做線程的異步撤消的設(shè)計(jì)

  • 線程的異步撤銷是指: 某個(gè)線程的執(zhí)行立刻被其他線程給強(qiáng)制終止了
  • 請(qǐng)不要單單為了讓“設(shè)計(jì)更簡(jiǎn)單”或者“看起了更簡(jiǎn)單”而使用線程的異步撤消

咋一看還是挺簡(jiǎn)單的。但是搞不好可能會(huì)引起各種各樣的問題。請(qǐng)不要在不能把握問題的實(shí)質(zhì)就做出使用線程的異步撤消的設(shè)計(jì)!

在pthread的規(guī)格說明中,允許一個(gè)線程可以強(qiáng)制中斷某個(gè)線程的執(zhí)行。這就是所說的異步撤消。


線程的撤消有下面的兩種方式。

  • 方式1: 異步撤消(PTHREAD_CANCEL_ASYNCHRONOUS)
    • 撤銷動(dòng)作是馬上進(jìn)行的
  • 方式2: 延遲撤銷(PTHREAD_CANCEL_DEFERRED)
    • 撤消動(dòng)作,是讓線程的處理一直被延遲到撤消點(diǎn)才會(huì)去執(zhí)行

還有,到底是用哪種撤消方式,不是撤消側(cè),而是被撤銷側(cè)能夠決定的*1。另外,在被撤銷側(cè)也能夠選擇完全禁止撤消的這種方式 *2


會(huì)造成什么問題呢

那么,讓我看看亂用線程的異步撤消會(huì)引起什么問題呢。看過準(zhǔn)則3的人可能會(huì)知道,在下面的腳本里,被撤銷線程以外的任意一個(gè)線程會(huì)被死鎖。

  1. 線程1中調(diào)用malloc函數(shù)正在做內(nèi)存分配的過程中,線程2異步撤消了線程1的處理
  2. 線程1馬上被撤銷,但是malloc函數(shù)中的互斥鎖就沒有線程去解除了
  3. 后面的任意一個(gè)線程如果再次調(diào)用malloc函數(shù)的話就會(huì)馬上導(dǎo)致該線程死鎖

在這個(gè)例子中使用了malloc函數(shù),但是其他的危險(xiǎn)函數(shù)還有很多。


反之,即使做了異步撤消也沒有問題的函數(shù)也有少數(shù)存在的、我們把它們叫做「async-cancel safe函數(shù)」或者「異步撤消安全函數(shù)」。在一些商用UNIX*3中、OS提供的api函數(shù)的文檔說明中有async-cancel safety的記載、但是在Linux(glibc)里就很遺憾,幾乎沒有相關(guān)的說明。


在這兒,參看規(guī)格(SUSv3)的話,會(huì)發(fā)現(xiàn),、描述異步撤消安全的函數(shù)只有3個(gè)

  1. pthread_cancel
  2. pthread_setcancelstate
  3. pthread_setcanceltype

而且、里面還有"No other functions are required to be async-cancel-safe"這樣的記載。因此,Linux的場(chǎng)合,如果在文檔里沒有記載成async-cancel safety的函數(shù),我們還是把它假定成不安全的函數(shù)為好!


如何避免這些問題呢

在多線程編程中為了安全的使用異步撤消處理、有沒有回避死鎖的方法呢?我們?cè)囍肓藥讉€(gè)。他們與準(zhǔn)則3里的線程+fork的場(chǎng)合的回避策很相似。


回避方法1: 被撤銷線程中,只能使用異步撤消安全函數(shù)


首先,被撤銷線程中,只能使用異步撤消安全函數(shù)。但是這個(gè)方法

  • 在規(guī)格說明中只有3個(gè)異步撤消安全的函數(shù)
  • 這些以外的函數(shù)是不是異步撤消安全(商用UNIX)、因?yàn)闆]有說明文檔我們不清楚(Linux)

中有以上的兩點(diǎn),所以這個(gè)回避方法幾乎不現(xiàn)實(shí)。


回避方法2: 被撤銷線程中,在做非異步撤消安全處理的過程中,再把撤消方式設(shè)置成「延遲」或者是「禁止」


第二個(gè)是,被撤銷線程在做非異步撤消安全處理的過程中,把撤消方式再設(shè)定成「延遲」或者「禁止」。對(duì)于這個(gè)方法

  • 就像方法1寫的那樣、要把我那個(gè)函數(shù)是異步撤消安全的一時(shí)還是挺麻煩的
  • 在任意的場(chǎng)所并不能保證撤消動(dòng)作會(huì)被馬上執(zhí)行
    • 例如,再設(shè)定成「延遲」后的一段時(shí)間內(nèi)如果撤消發(fā)生時(shí)、某個(gè)正在阻塞的I/O函數(shù)是否能夠被解除阻塞還是挺微妙的
    • 如果設(shè)定成撤消禁止的話,則撤消會(huì)被屏蔽掉

有上面樣的問題、會(huì)導(dǎo)致「一精心設(shè)計(jì)撤消方式的替換,從一開始就使用延遲撤消還不夠好」這樣的結(jié)果。所以這幾乎是不好的一個(gè)回避策。


回避方法3: 使用pthread_cleanup_push函數(shù),登錄異步撤消時(shí)的線程數(shù)據(jù)清除的回調(diào)函數(shù)


第三種則是,用pthread_cleanup_push函數(shù)、登錄一個(gè)在異步撤消發(fā)生時(shí)的數(shù)據(jù)清除的回調(diào)函數(shù)。這和在準(zhǔn)則3中介紹的pthread_atfork函數(shù)有點(diǎn)兒類似。用這個(gè)函數(shù)登錄的回調(diào)函數(shù)來清除線程的數(shù)據(jù)和鎖,就可以回避死鎖了。


...但是,pthread_cleanup_push函數(shù)登錄的回調(diào)函數(shù),在「延遲撤消」的場(chǎng)合是不能被調(diào)用的。因此、這個(gè)回避方法對(duì)于異步撤消沒有什么大的作用。


回避方法4: 不要執(zhí)行異步撤消處理


最后是、不要執(zhí)行異步撤消處理。反而代之的是、

  • 設(shè)計(jì)成不依賴使用異步撤消那樣的處理

或者

  • 不得不使用線程撤消的話、不做異步撤消而作延遲撤消的處理

這是比較實(shí)際的做法,是我們值得推薦的。

*1:pthread_setcanceltype函數(shù)

*2:pthread_setcancelstate函數(shù)

*3:Solaris和HP-UX等

我的個(gè)人簡(jiǎn)歷第一頁(yè) 我的個(gè)人簡(jiǎn)歷第二頁(yè)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品国产免费看久久精品| 欧美大片国产精品| 蜜桃精品久久久久久久免费影院| 国产精品免费小视频| 亚洲国产高潮在线观看| 久久一区二区三区国产精品| 亚洲国产国产亚洲一二三| 亚洲人成人一区二区三区| 欧美色精品天天在线观看视频| 久久精品最新地址| 亚洲国产一区二区三区a毛片| 亚洲最新在线视频| 欧美激情亚洲另类| 欧美一区日韩一区| 国产精品天天摸av网| 亚洲欧美综合精品久久成人| 在线观看亚洲| 国产日韩欧美视频在线| 欧美大片第1页| 欧美激情精品久久久久久蜜臀| 亚洲国内精品在线| 亚洲一区精品电影| 国产亚洲激情在线| 亚洲免费av观看| 激情懂色av一区av二区av| 99国内精品久久| 亚洲高清在线精品| 性感少妇一区| 亚洲天堂av在线免费观看| 久久香蕉国产线看观看av| 久久成人国产精品| 欧美性大战久久久久久久| 91久久中文字幕| 亚洲黑丝在线| 国产专区精品视频| 午夜久久美女| 欧美日韩成人| 欧美激情精品久久久久久变态 | 麻豆成人综合网| 一区二区三区欧美成人| 亚洲精品视频在线播放| 久久天堂成人| 久久久999| 国产欧美日本一区二区三区| 在线视频亚洲一区| 亚洲素人一区二区| 欧美日韩一区二区在线| 亚洲国产综合视频在线观看| 亚洲国产精品专区久久| 亚洲三级电影全部在线观看高清| 欧美亚洲一级片| 国产精品久久久91| 久久久久久夜| 国产日韩欧美夫妻视频在线观看| 亚洲图片在区色| 香蕉久久精品日日躁夜夜躁| 国产精品视频你懂的| 亚洲综合第一| 久久久国产成人精品| 国产原创一区二区| 国内精品国语自产拍在线观看| 一本色道久久综合狠狠躁篇的优点| 日韩视频免费观看| 欧美日韩国产免费观看| 99精品福利视频| 午夜一级久久| 国产一区二区精品在线观看| 久久精品国产欧美激情| 欧美不卡激情三级在线观看| 亚洲国产欧美国产综合一区| 免费在线欧美视频| 亚洲精品国产精品乱码不99| 亚洲午夜黄色| 国产区亚洲区欧美区| 久久久777| 99pao成人国产永久免费视频| 欧美激情精品久久久久久大尺度 | 国产一区二区黄色| 美国三级日本三级久久99| 亚洲日本va午夜在线影院| 亚洲女人天堂av| 妖精成人www高清在线观看| 乱码第一页成人| 一区二区久久久久久| 一区二区三区欧美视频| 久久人人精品| 亚洲乱码国产乱码精品精| 国产精品毛片高清在线完整版| 欧美专区在线观看一区| 91久久精品视频| 欧美在线你懂的| 亚洲国产裸拍裸体视频在线观看乱了| 欧美日韩精品免费观看视频完整| 亚洲欧美日韩一区二区三区在线| 欧美高清视频一二三区| 亚洲影院色在线观看免费| 永久免费视频成人| 国产精品欧美日韩一区| 欧美.www| 亚洲精品自在在线观看| 欧美猛交免费看| 午夜精品区一区二区三| 亚洲国产欧美在线| 欧美在线观看网址综合| 亚洲久久一区二区| 国产一区二区三区在线观看免费视频 | 国产亚洲成人一区| 美女久久一区| 亚洲欧美另类中文字幕| 亚洲区一区二区三区| 亚洲欧美日韩国产综合精品二区 | 久久精品免费观看| 亚洲欧洲日韩在线| 久久久亚洲一区| 亚洲欧美国产精品va在线观看| 免费亚洲婷婷| 欧美一级播放| 亚洲一区二区三区高清| 亚洲高清视频中文字幕| 久久精品视频导航| 亚洲欧美成人一区二区在线电影| 日韩亚洲一区二区| 亚洲欧洲一区二区三区久久| 99国产麻豆精品| 午夜免费日韩视频| 一个色综合导航| 亚洲黄色成人| 亚洲福利av| 欧美日韩国产欧| 久久一区二区三区av| 久热精品在线| 亚洲深夜福利在线| 亚洲美女少妇无套啪啪呻吟| 欧美国产精品久久| 男女精品网站| 免费av成人在线| 久久亚洲精品中文字幕冲田杏梨 | 老司机精品导航| 久久久久久久久久码影片| 性色av一区二区三区红粉影视| 亚洲中无吗在线| 亚洲欧美亚洲| 欧美在线视频日韩| 久久久久亚洲综合| 免费h精品视频在线播放| 欧美伦理在线观看| 一区二区三区欧美视频| 亚洲视频一区二区在线观看 | 亚洲国产视频直播| 最新成人av网站| 日韩网站在线观看| 在线视频欧美精品| 欧美在线影院在线视频| 欧美一区日本一区韩国一区| 久久国产精品一区二区三区四区| 午夜精品三级视频福利| 久久se精品一区二区| 久久久久欧美精品| 欧美暴力喷水在线| 亚洲天堂网在线观看| 欧美在线关看| 欧美亚州一区二区三区| 国产精品久久久久毛片大屁完整版 | 久久亚洲国产成人| 欧美91精品| 亚洲伦理在线| 亚洲午夜高清视频| 久久精品论坛| 欧美日韩日本国产亚洲在线| 国产精品日韩二区| 亚洲二区免费| 亚洲一区二区三区四区五区黄| 欧美一区二区三区免费视| 免费欧美在线视频| 夜夜嗨av一区二区三区四季av | 欧美午夜一区二区三区免费大片| 欧美视频网址| 国产一区二区中文| 日韩视频在线观看| 欧美一区亚洲二区| 亚洲第一色中文字幕| 亚洲国产精品va在线看黑人动漫| 欧美日韩精品免费| 韩国女主播一区| 亚洲视频大全| 久久女同精品一区二区| 亚洲美女区一区| 欧美专区亚洲专区| 欧美性色aⅴ视频一区日韩精品| 国产性天天综合网| aa成人免费视频| 狼狼综合久久久久综合网| 一二美女精品欧洲| 麻豆精品精华液| 国产欧美一区二区精品忘忧草| 亚洲精品免费一区二区三区| 久久精品网址| 一区二区三区四区五区精品视频| 亚洲欧洲中文日韩久久av乱码| 欧美三区在线|