中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      Linux多線程:線程的分離與結合

      時間:2024-09-26 19:00:48 Linux認證 我要投稿
      • 相關推薦

      Linux多線程:線程的分離與結合

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

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

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

        另外一個可能常用的屬性是線程的優先級,它存放在結構sched_param中。用函數pthread_attr_getschedparam和函數pthread_attr_setschedparam進行存放,一般說來,我們總是先取優先級,對取得的值修改后再存放回去。

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

        #include

        void pthread_exit(void *retval);

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

        int pthread_detach(pthread_t th);

        如果線程處于joinable狀態,則只能只能被創建他的線程等待終止。

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

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

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

        創建 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 時避免線程的資源在線程結束時不能得到正確釋放,從而避免產生潛在的內存泄漏問題,在對待線程結束時,要確保該線程處于 detached 狀態,否著就需要調用 pthread_join() 函數來對其進行資源回收。

      【Linux多線程:線程的分離與結合】相關文章:

      Java多線程的實現方式07-08

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

      java多線程面試題201710-03

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

      sun認證考試經驗:多線程的幾種實現方法詳解07-24

      sun認證考試輔導:java關于多線程的部分操作07-27

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

      Java線程同步的方法10-25

      Linux認證概念10-29

      Linux認證優勢06-10

      主站蜘蛛池模板: av永远在线免费观看| 91情侣在线精品国产免费| 历史| аⅴ天堂一区视频在线观看| 久久一二三四区中文字幕| 精品无人区无码乱码大片国产| 祥云县| 在线观看精品视频一区二区三区 | 国产一精品一aⅴ一免费| 三台县| 夏津县| 资源县| 凤山县| 南充市| 利津县| 株洲县| 新野县| 鄯善县| 国产精品一品二品有码| 国产精品一区2区三区| 一区二区三区四区四色av| 久久婷婷国产五月综合色| 久久亚洲精品一区二区| 国产三级精品三级男人的天堂,| 精品免费看国产一区二区白浆| 免费观看成人稀缺视频在线播放| 中文字幕日韩熟女av| 亚洲大片中文字幕久久| 一级无码啪啪| 天天摸天天做天天爽天天舒服| 1234.com麻豆性爰爱影| 日韩av一区二区三区四区av| 99熟妇人妻精品一区五一看片| 国产亚洲精品综合在线网址| 亚洲精品成人网线在线播放va | 惠水县| 婺源县| 久久久久亚洲AV片无码乐播| 亚洲最新中文字幕一区| 中文字幕日产人妻久久| 国产精品国产三级国产无毒|