<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • Linux多線程:線程的分離與結(jié)合

    時間:2024-09-26 19:00:48 Linux認(rèn)證 我要投稿
    • 相關(guān)推薦

    Linux多線程:線程的分離與結(jié)合

      在任何一個時間點上,線程是可結(jié)合的(joinable),或者是分離的(detached)。一個可結(jié)合的線程能夠被其他線程收回其資源和殺死;在被其他線程回收之前,它的存儲器資源(如棧)是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時由系統(tǒng)自動釋放。

      線程的分離狀態(tài)決定一個線程以什么樣的方式來終止自己。在上面的例子中,我們采用了線程的默認(rèn)屬性,即為非分離狀態(tài)(即可結(jié)合的,joinable,需要回收),這種情況下,原有的線程等待創(chuàng)建的線程結(jié)束;只有當(dāng)pthread_join()函數(shù)返回時,創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。而分離線程不是這樣子的,它沒有被其他的線程所等待,自己運(yùn)行結(jié)束了,線程也就終止了,馬上釋放系統(tǒng)資源。程序員應(yīng)該根據(jù)自己的需要,選擇適當(dāng)?shù)姆蛛x狀態(tài)。

      設(shè)置線程分離狀態(tài)的函數(shù)為pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二個參數(shù)可選為PTHREAD_CREATE_DETACHED(分離線程)和PTHREAD _CREATE_JOINABLE(非分離線程)。這里要注意的一點是,如果設(shè)置一個線程為分離線程,而這個線程運(yùn)行又非常快,它很可能在pthread_create函數(shù)返回之前就終止了,它終止以后就可能將線程號和系統(tǒng)資源移交給其他的線程使用,這樣調(diào)用pthread_create的線程就得到了錯誤的線程號。要避免這種情況可以采取一定的同步措施,最簡單的方法之一是可以在被創(chuàng)建的線程里調(diào)用pthread_cond_timewait函數(shù),讓這個線程等待一會兒,留出足夠的時間讓函數(shù)pthread_create返回。設(shè)置一段等待時間,是在多線程編程里常用的方法。但是注意不要使用諸如wait()之類的函數(shù),它們是使整個進(jìn)程睡眠,并不能解決線程同步的問題。

      另外一個可能常用的屬性是線程的優(yōu)先級,它存放在結(jié)構(gòu)sched_param中。用函數(shù)pthread_attr_getschedparam和函數(shù)pthread_attr_setschedparam進(jìn)行存放,一般說來,我們總是先取優(yōu)先級,對取得的值修改后再存放回去。

      線程等待——正確處理線程終止

      #include

      void pthread_exit(void *retval);

      void pthread_join(pthread_t th,void *thread_return);//掛起等待th結(jié)束,*thread_return=retval;

      int pthread_detach(pthread_t th);

      如果線程處于joinable狀態(tài),則只能只能被創(chuàng)建他的線程等待終止。

      在Linux平臺默認(rèn)情況下,雖然各個線程之間是相互獨(dú)立的,一個線程的終止不會去通知或影響其他的線程。但是已經(jīng)終止的線程的資源并不會隨著線程的終止而得到釋放,我們需要調(diào)用 pthread_join() 來獲得另一個線程的終止?fàn)顟B(tài)并且釋放該線程所占的資源。(說明:線程處于joinable狀態(tài)下)

      調(diào)用該函數(shù)的線程將掛起,等待 th 所表示的線程的結(jié)束。 thread_return 是指向線程 th返回值的指針。需要注意的是 th 所表示的線程必須是 joinable 的,即處于非 detached(游離)狀態(tài);并且只可以有唯一的一個線程對 th 調(diào)用 pthread_join() 。如果 th 處于 detached 狀態(tài),那么對 th 的 pthread_join() 調(diào)用將返回錯誤。

      如果不關(guān)心一個線程的結(jié)束狀態(tài),那么也可以將一個線程設(shè)置為 detached 狀態(tài),從而讓操作系統(tǒng)在該線程結(jié)束時來回收它所占的資源。將一個線程設(shè)置為detached 狀態(tài)可以通過兩種方式來實現(xiàn)。一種是調(diào)用 pthread_detach() 函數(shù),可以將線程 th 設(shè)置為 detached 狀態(tài)。另一種方法是在創(chuàng)建線程時就將它設(shè)置為 detached 狀態(tài),首先初始化一個線程屬性變量,然后將其設(shè)置為 detached 狀態(tài),最后將它作為參數(shù)傳入線程創(chuàng)建函數(shù) pthread_create(),這樣所創(chuàng)建出來的線程就直接處于 detached 狀態(tài)。

      創(chuàng)建 detach 線程:

      pthread_t tid;

      pthread_attr_t attr;

      pthread_attr_init(&attr);

      pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

      pthread_create(&tid, &attr, THREAD_FUNCTION, arg);

      總之為了在使用 pthread 時避免線程的資源在線程結(jié)束時不能得到正確釋放,從而避免產(chǎn)生潛在的內(nèi)存泄漏問題,在對待線程結(jié)束時,要確保該線程處于 detached 狀態(tài),否著就需要調(diào)用 pthread_join() 函數(shù)來對其進(jìn)行資源回收。

    【Linux多線程:線程的分離與結(jié)合】相關(guān)文章:

    Java多線程的實現(xiàn)方式07-08

    PHP Curl多線程原理詳解09-11

    java多線程面試題201710-03

    2016年java多線程面試題及答案07-02

    sun認(rèn)證考試經(jīng)驗:多線程的幾種實現(xiàn)方法詳解07-24

    sun認(rèn)證考試輔導(dǎo):java關(guān)于多線程的部分操作07-27

    AndroidApp中使用SurfaceView制作多線程動畫的實例講解09-05

    Java線程同步的方法10-25

    Linux認(rèn)證概念10-29

    Linux認(rèn)證優(yōu)勢06-10

    主站蜘蛛池模板: 亚洲精品无码久久一线| 国产精品天天影视久久综合网 | 国产在线精品一区二区高清不卡 | 久久久久无码国产精品不卡| 99热亚洲色精品国产88| 无码国产精品一区二区免费16| 精品国精品国产自在久国产应用男 | 国产三级精品三级在线观看专1| 国产成人精品日本亚洲专| 精品无人区一区二区三区| 无码精品日韩中文字幕| 欧美精品亚洲精品日韩精品 | 国产午夜精品一区二区三区漫画| 亚洲精品乱码久久久久久按摩 | 无码AV动漫精品一区二区免费| 精品久久久无码中文字幕| 国产综合色产在线精品| 国产综合成人色产三级高清在线精品发布 | 无码精品日韩中文字幕| 亚洲午夜精品久久久久久浪潮| 久久精品国产一区二区电影| 精品国产福利盛宴在线观看| 精品人妻伦一二三区久久| 久久精品国产亚洲Aⅴ香蕉 | 精品久久久久久无码专区不卡| 无码精品A∨在线观看| 午夜精品久久久久久99热| 无码人妻精品一区二区三| 亚洲AV永久无码精品一区二区| 欧美成人精品第一区二区| 精品无人区无码乱码大片国产| 国产三级国产精品国产普男人| 欧美精品人人做人人爱视频| 精品亚洲永久免费精品| 欧美日韩精品久久久久| 精品国产成人在线| 亚洲成人国产精品| 久久亚洲精品国产精品| 中文字幕无码久久精品青草| 亚洲精品二三区| 91老司机深夜福利精品视频在线观看 |