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

posts - 297,  comments - 15,  trackbacks - 0
這是一個(gè)關(guān)于Posix線程編程的專欄。作者在闡明概念的基礎(chǔ)上,將向您詳細(xì)講述Posix線程庫API。本文是第一篇將向您講述線程的創(chuàng)建與取消。
一、線程創(chuàng)建
1.1 線程與進(jìn)程
相對進(jìn)程而言,線程是一個(gè)更加接近于執(zhí)行體的概念,它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。在串行程序基礎(chǔ)上引入線程和進(jìn)程是為了提高程序的并發(fā)度,從而提高程序運(yùn)行效率和響應(yīng)時(shí)間。
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。
1.2 創(chuàng)建線程
POSIX通過pthread_create()函數(shù)創(chuàng)建線程,API定義如下:
int  pthread_create(pthread_t  *  thread, pthread_attr_t * attr, 
void * (*start_routine)(void *), void * arg)
與fork()調(diào)用創(chuàng)建一個(gè)進(jìn)程的方法不同,pthread_create()創(chuàng)建的線程并不具備與主線程(即調(diào)用pthread_create()的線 程)同樣的執(zhí)行序列,而是使其運(yùn)行start_routine(arg)函數(shù)。thread返回創(chuàng)建的線程ID,而attr是創(chuàng)建線程時(shí)設(shè)置的線程屬性 (見下)。pthread_create()的返回值表示線程創(chuàng)建是否成功。盡管arg是void *類型的變量,但它同樣可以作為任意類型的參數(shù)傳給start_routine()函數(shù);同時(shí),start_routine()可以返回一個(gè)void *類型的返回值,而這個(gè)返回值也可以是其他類型,并由pthread_join()獲取。
1.3 線程創(chuàng)建屬性
pthread_create()中的attr參數(shù)是一個(gè)結(jié)構(gòu)指針,結(jié)構(gòu)中的元素分別對應(yīng)著新線程的運(yùn)行屬性,主要包括以下幾項(xiàng):
__detachstate,表示新線程是否與進(jìn)程中其他線程脫離同步,如果置位則新線程不能用pthread_join()來同步,且在退出時(shí)自行釋放 所占用的資源。缺省為PTHREAD_CREATE_JOINABLE狀態(tài)。這個(gè)屬性也可以在線程創(chuàng)建并運(yùn)行以后用pthread_detach()來設(shè) 置,而一旦設(shè)置為PTHREAD_CREATE_DETACH狀態(tài)(不論是創(chuàng)建時(shí)設(shè)置還是運(yùn)行時(shí)設(shè)置)則不能再恢復(fù)到 PTHREAD_CREATE_JOINABLE狀態(tài)。
__schedpolicy,表示新線程的調(diào)度策略,主要包括SCHED_OTHER(正常、非實(shí)時(shí))、SCHED_RR(實(shí)時(shí)、輪轉(zhuǎn)法)和 SCHED_FIFO(實(shí)時(shí)、先入先出)三種,缺省為SCHED_OTHER,后兩種調(diào)度策略僅對超級用戶有效。運(yùn)行時(shí)可以用過 pthread_setschedparam()來改變。
__schedparam,一個(gè)struct sched_param結(jié)構(gòu),目前僅有一個(gè)sched_priority整型變量表示線程的運(yùn)行優(yōu)先級。這個(gè)參數(shù)僅當(dāng)調(diào)度策略為實(shí)時(shí)(即SCHED_RR 或SCHED_FIFO)時(shí)才有效,并可以在運(yùn)行時(shí)通過pthread_setschedparam()函數(shù)來改變,缺省為0。
__inheritsched,有兩種值可供選擇:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表 示新線程使用顯式指定調(diào)度策略和調(diào)度參數(shù)(即attr中的值),而后者表示繼承調(diào)用者線程的值。缺省為PTHREAD_EXPLICIT_SCHED。
__scope,表示線程間競爭CPU的范圍,也就是說線程優(yōu)先級的有效范圍。POSIX的標(biāo)準(zhǔn)中定義了兩個(gè)值: PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示與系統(tǒng)中所有線程一起競爭CPU時(shí)間,后者表示僅與同 進(jìn)程中的線程競爭CPU。目前LinuxThreads僅實(shí)現(xiàn)了PTHREAD_SCOPE_SYSTEM一值。
pthread_attr_t結(jié)構(gòu)中還有一些值,但不使用pthread_create()來設(shè)置。
為了設(shè)置這些屬性,POSIX定義了一系列屬性設(shè)置函數(shù),包括pthread_attr_init()、pthread_attr_destroy()和與各個(gè)屬性相關(guān)的pthread_attr_get---/pthread_attr_set---函數(shù)。
1.4 線程創(chuàng)建的Linux實(shí)現(xiàn)
我們知道,Linux的線程實(shí)現(xiàn)是在核外進(jìn)行的,核內(nèi)提供的是創(chuàng)建進(jìn)程的接口do_fork()。內(nèi)核提供了兩個(gè)系統(tǒng)調(diào)用__clone()和fork (),最終都用不同的參數(shù)調(diào)用do_fork()核內(nèi)API。當(dāng)然,要想實(shí)現(xiàn)線程,沒有核心對多進(jìn)程(其實(shí)是輕量級進(jìn)程)共享數(shù)據(jù)段的支持是不行的,因 此,do_fork()提供了很多參數(shù),包括CLONE_VM(共享內(nèi)存空間)、CLONE_FS(共享文件系統(tǒng)信息)、CLONE_FILES(共享文 件描述符表)、CLONE_SIGHAND(共享信號句柄表)和CLONE_PID(共享進(jìn)程ID,僅對核內(nèi)進(jìn)程,即0號進(jìn)程有效)。當(dāng)使用fork系統(tǒng) 調(diào)用時(shí),內(nèi)核調(diào)用do_fork()不使用任何共享屬性,進(jìn)程擁有獨(dú)立的運(yùn)行環(huán)境,而使用pthread_create()來創(chuàng)建線程時(shí),則最終設(shè)置了所 有這些屬性來調(diào)用__clone(),而這些參數(shù)又全部傳給核內(nèi)的do_fork(),從而創(chuàng)建的"進(jìn)程"擁有共享的運(yùn)行環(huán)境,只有棧是獨(dú)立的,由 __clone()傳入。
Linux線程在核內(nèi)是以輕量級進(jìn)程的形式存在的,擁有獨(dú)立的進(jìn)程表項(xiàng),而所有的創(chuàng)建、同步、刪除等操作都在核外pthread庫中進(jìn)行。pthread 庫使用一個(gè)管理線程(__pthread_manager(),每個(gè)進(jìn)程獨(dú)立且唯一)來管理線程的創(chuàng)建和終止,為線程分配線程ID,發(fā)送線程相關(guān)的信號 (比如Cancel),而主線程(pthread_create())的調(diào)用者則通過管道將請求信息傳給管理線程。
二、線程取消
2.1 線程取消的定義
一般情況下,線程在其主體函數(shù)退出的時(shí)候會(huì)自動(dòng)終止,但同時(shí)也可以因?yàn)榻邮盏搅硪粋€(gè)線程發(fā)來的終止(取消)請求而強(qiáng)制終止。
2.2 線程取消的語義
線程取消的方法是向目標(biāo)線程發(fā)Cancel信號,但如何處理Cancel信號則由目標(biāo)線程自己決定,或者忽略、或者立即終止、或者繼續(xù)運(yùn)行至Cancelation-point(取消點(diǎn)),由不同的Cancelation狀態(tài)決定。
線程接收到CANCEL信號的缺省處理(即pthread_create()創(chuàng)建線程的缺省狀態(tài))是繼續(xù)運(yùn)行至取消點(diǎn),也就是說設(shè)置一個(gè)CANCELED狀態(tài),線程繼續(xù)運(yùn)行,只有運(yùn)行至Cancelation-point的時(shí)候才會(huì)退出。
2.3 取消點(diǎn)
根據(jù)POSIX標(biāo)準(zhǔn),pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函數(shù)以及read()、write()等會(huì)引起阻塞的系 統(tǒng)調(diào)用都是Cancelation-point,而其他pthread函數(shù)都不會(huì)引起Cancelation動(dòng)作。但是pthread_cancel的手 冊頁聲稱,由于LinuxThread庫與C庫結(jié)合得不好,因而目前C庫函數(shù)都不是Cancelation-point;但CANCEL信號會(huì)使線程從阻 塞的系統(tǒng)調(diào)用中退出,并置EINTR錯(cuò)誤碼,因此可以在需要作為Cancelation-point的系統(tǒng)調(diào)用前后調(diào)用 pthread_testcancel(),從而達(dá)到POSIX標(biāo)準(zhǔn)所要求的目標(biāo),即如下代碼段:
pthread_testcancel();
    retcode = read(fd, buffer, length);
    pthread_testcancel();
2.4 程序設(shè)計(jì)方面的考慮
如果線程處于無限循環(huán)中,且循環(huán)體內(nèi)沒有執(zhí)行至取消點(diǎn)的必然路徑,則線程無法由外部其他線程的取消請求而終止。因此在這樣的循環(huán)體的必經(jīng)路徑上應(yīng)該加入pthread_testcancel()調(diào)用。
2.5 與線程取消相關(guān)的pthread函數(shù)
int pthread_cancel(pthread_t thread)
發(fā)送終止信號給thread線程,如果成功則返回0,否則為非0值。發(fā)送成功并不意味著thread會(huì)終止。
int pthread_setcancelstate(int state, int *oldstate)
設(shè)置本線程對Cancel信號的反應(yīng),state有兩種值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分別表示收到信號后設(shè)為CANCLED狀態(tài)和忽略CANCEL信號繼續(xù)運(yùn)行;old_state如果不為 NULL則存入原來的Cancel狀態(tài)以便恢復(fù)。
int pthread_setcanceltype(int type, int *oldtype)
設(shè)置本線程取消動(dòng)作的執(zhí)行時(shí)機(jī),type由兩種取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYCHRONOUS,僅當(dāng)Cancel狀態(tài)為Enable時(shí)有效,分別表示收到信號后繼續(xù)運(yùn)行至下一個(gè)取消點(diǎn)再退出和 立即執(zhí)行取消動(dòng)作(退出);oldtype如果不為NULL則存入運(yùn)來的取消動(dòng)作類型值。
void pthread_testcancel(void)
檢查本線程是否處于Canceld狀態(tài),如果是,則進(jìn)行取消動(dòng)作,否則直接返回。
轉(zhuǎn)自:

posted on 2009-11-25 15:22 chatler 閱讀(758) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品在线观看| 欧美日本高清| 免费高清在线视频一区·| 激情成人综合| 欧美电影美腿模特1979在线看| 免费的成人av| 一本色道久久综合精品竹菊| 欧美午夜精品久久久久免费视| 亚洲一区二区三区成人在线视频精品 | 99视频+国产日韩欧美| 一区二区三区国产盗摄| 欧美激情女人20p| 一区二区三区av| 久久精品国产成人| 亚洲日本中文字幕| 国产精品swag| 久久精品视频播放| 亚洲伦理在线| 久久国产精品黑丝| 亚洲人午夜精品| 国产女同一区二区| 欧美国产高潮xxxx1819| 亚洲免费视频网站| 欧美国产亚洲另类动漫| 亚洲欧美国产精品专区久久| 好看的亚洲午夜视频在线| 欧美交受高潮1| 欧美一区二区在线播放| 亚洲精品少妇30p| 久久女同精品一区二区| 一本不卡影院| 依依成人综合视频| 国产精品久久夜| 欧美不卡一区| 欧美一区二区性| 99国产精品久久久| 欧美激情麻豆| 久久精品视频在线观看| 在线视频亚洲欧美| 在线免费观看视频一区| 国产精品一区二区三区四区五区| 男男成人高潮片免费网站| 午夜精品视频在线观看一区二区| 欧美激情亚洲自拍| 久久精品国产综合精品| 亚洲一区日韩| 亚洲欧洲日本在线| 在线观看视频一区二区| 国产麻豆91精品| 欧美日韩精品国产| 欧美高清在线观看| 久久午夜精品一区二区| 欧美一区日韩一区| 亚洲欧美精品一区| 日韩一级裸体免费视频| 亚洲国产精品一区二区尤物区| 久久成人免费| 亚洲自拍都市欧美小说| 日韩小视频在线观看专区| 在线日韩中文字幕| 国产亚洲制服色| 国产精品一区视频| 国产精品久久久久久久久果冻传媒 | 99re66热这里只有精品3直播 | 亚洲精品日韩综合观看成人91| 国产一区二区观看| 国产精品―色哟哟| 国产精品免费视频观看| 国产精品久久77777| 国产精品99免视看9| 欧美日韩免费在线视频| 欧美日韩色综合| 欧美日韩国产精品自在自线| 欧美激情一区二区在线| 欧美成人免费大片| 欧美久久九九| 欧美日韩国产一区精品一区| 欧美另类女人| 欧美日韩喷水| 欧美视频在线观看| 国产精品看片你懂得| 国产精品久久久久久久久久免费 | 亚洲区欧美区| 日韩视频一区二区三区在线播放| 亚洲国产视频一区二区| 亚洲国产日韩一区二区| 亚洲精品自在在线观看| 中文亚洲免费| 新狼窝色av性久久久久久| 欧美一级片一区| 久久精品国产久精国产爱| 久久精品视频99| 欧美 日韩 国产 一区| 亚洲高清不卡| 99国产精品国产精品久久| 亚洲欧美成人一区二区在线电影| 欧美一区二区视频观看视频| 久久久久看片| 欧美韩日亚洲| 国产精品爽黄69| 在线观看欧美日韩国产| 亚洲靠逼com| 午夜精品在线观看| 美日韩精品免费| 亚洲精品永久免费| 亚洲欧美卡通另类91av| 久久夜色精品国产噜噜av| 欧美激情中文字幕一区二区| 国产精品盗摄久久久| 国产真实乱子伦精品视频| 亚洲精品美女在线观看| 亚洲欧美日韩在线综合| 免费久久精品视频| 一本久道综合久久精品| 久久精品视频播放| 欧美日韩精品一区二区| 国产中文一区二区三区| 一本一本a久久| 久久免费黄色| 中国亚洲黄色| 美女黄毛**国产精品啪啪| 欧美色网一区二区| 亚洲国产日日夜夜| 午夜亚洲伦理| 亚洲高清资源综合久久精品| 亚洲天堂成人在线视频| 蜜桃av综合| 国产精品免费看片| 日韩系列欧美系列| 久久久精品国产免大香伊 | 欧美日韩高清一区| 一区二区亚洲精品国产| 亚洲欧美视频在线观看视频| 亚洲成人在线网站| 欧美在线日韩| 国产精品激情偷乱一区二区∴| 亚洲激情影视| 久久精品一本| 亚洲午夜精品久久| 欧美日韩精品在线观看| 亚洲日本激情| 美女主播一区| 性欧美长视频| 国产精品欧美日韩| 亚洲婷婷免费| 亚洲精品在线视频| 欧美大片在线看免费观看| 在线播放精品| 久久久一区二区三区| 亚洲免费视频成人| 国产精品久久久久久久久久久久久久| 亚洲免费av片| 亚洲国产成人av在线 | 美日韩精品视频| 狠狠色狠狠色综合日日91app| 午夜精品久久久久久| 一本色道久久99精品综合| 欧美激情精品久久久| 亚洲国产高清一区| 每日更新成人在线视频| 欧美一区二区视频观看视频| 国产性猛交xxxx免费看久久| 欧美一级二区| 亚洲欧美日韩国产综合精品二区| 国产精品久久久久一区二区| 中文精品视频一区二区在线观看| 亚洲人成艺术| 欧美日韩视频一区二区三区| 一区二区三区波多野结衣在线观看| 亚洲国产三级| 欧美日本不卡| 亚洲一区二区黄| 亚洲视频在线播放| 国产精品夜色7777狼人| 午夜视频在线观看一区| 亚洲欧美综合| 狠狠色伊人亚洲综合网站色| 六月丁香综合| 老司机免费视频久久| 亚洲毛片在线观看.| 亚洲精品一区二区网址| 国产精品成人播放| 欧美一区二区精品在线| 欧美在线视频观看| 亚洲成人在线视频网站| 亚洲国产精选| 国产精品啊啊啊| 久久久精品国产99久久精品芒果| 久久精品日产第一区二区三区| 亚洲人成精品久久久久| 日韩视频一区二区在线观看| 国产精品一区二区视频| 久久亚洲视频| 欧美伦理a级免费电影| 亚洲自拍偷拍色片视频| 欧美一区二区黄色| 亚洲国产婷婷香蕉久久久久久| 亚洲日本免费电影| 国产日韩欧美一区在线| 欧美多人爱爱视频网站|