线程的终止分离
1.線程的終止
????????????????
????注意該函數(shù)是針對(duì)用戶級(jí)別的, 其中 retal 必須指向一個(gè)全局變量, 或者是一個(gè) malloc 分配的, 因?yàn)槿绻蔷€程的局部變量, 當(dāng)該線程退出時(shí), 其他線程不能得到這個(gè)變量, 因?yàn)榫€程的局部變量各自私有
2. 現(xiàn)成的取消
????????????????
????其中thread是線程的 tid
3.線程的等待與分離
????(1)線程的等待
????????????????
????注意已經(jīng)退出的線程它的空間并沒有被釋放, 它所占有的空間仍然在進(jìn)程內(nèi)部, 并且進(jìn)程創(chuàng)建的新的線程不會(huì)復(fù)用退出線程的空間, 因此對(duì)于已經(jīng)推出的線程而言, 它所占有的空間必須由主線程將其回收. 因?yàn)槿绻骶€程不對(duì)退出的線程進(jìn)行空間回收的, 會(huì)造成資源泄露.
????上面函數(shù)中 thread是線程的tid, 而retval 是一個(gè)指針, 這個(gè)指針指向一個(gè)指針, 它所指向的這個(gè)指針指向線程的返回值(對(duì)retval進(jìn)行一次解引用, 可以獲取到線程的返回值), 同樣成功時(shí)返回 0, 失敗時(shí)返回錯(cuò)誤碼.. 調(diào)用該函數(shù)的線程將會(huì)被掛起等待, 直到 id 為thread 的線程終止.
????線程退出的幾種情況
????1)代碼跑完結(jié)果正確,
????2)代碼跑完結(jié)果錯(cuò)誤
????線程通過不同方式退出, retval所指向的內(nèi)容是不同的
????1)如果線程線程是調(diào)用了return 終止(主線程不能用, 因?yàn)閙ain 函數(shù)調(diào)用return相當(dāng)于進(jìn)程退出), retval 指向線程函數(shù)的返回值
????2)如果線程被其他線程調(diào)用了 pthread_cancle , 此時(shí) retval 會(huì)指向一個(gè)常數(shù), PTHREAD_CANCLED, 該常數(shù)是被進(jìn)行了宏定義為 -1
????3)如果該函數(shù)是自己調(diào)用了 pthread_exit, retval 指向傳給pthread_exit 的參數(shù)的地址
????4)如果對(duì)線程的退出狀態(tài)不關(guān)心, 此時(shí)retval可以被設(shè)為 NULL
來看一段代碼
??????????????????????????????
????由上圖可以看出, 由于線程的終止方式采用了不同的方式終止, 一次返回值 ret 所指向的單元存放的信息也是不同的.而其中的 tid 是相同的那是因?yàn)?pthread_create 是用戶級(jí)別的調(diào)用, 而在用戶眼里,這個(gè) tid 就是一個(gè)地址
????(2)線程的分離
????默認(rèn)情況下, 線程是可分離的(線程在退出時(shí)必須對(duì)其空間進(jìn)行回收, 否則會(huì)造成內(nèi)存泄露), 因此必須對(duì)線程進(jìn)行等待, 但是當(dāng)我們不再關(guān)心線程的返回值的時(shí)候, 此時(shí)我們就可以對(duì)線程進(jìn)行分離. 即當(dāng)線程退出的時(shí)候, 我們可以采用一種機(jī)制, 告訴操作系統(tǒng), 該線程就要退出了, 此時(shí), 操作系統(tǒng)便可以在線程退出時(shí)自動(dòng)將該線程的資源釋放.其中一個(gè)線程可以被別的線程分離, 也可以自己分離自己
??????????????????????????????
??????????????????????????????
????其中 pthrea_self 用來獲取線程自身的 tid
??????????????????????????????
????在上圖中, 由于線程已經(jīng)分離, 但是我們還對(duì)其進(jìn)行 join, 此時(shí)必定join 失敗, 即對(duì)一個(gè)已經(jīng)分離的線程不能再進(jìn)行 join
總結(jié)
- 上一篇: lol当前版本ADC哪个强势?为什么强势
- 下一篇: 我的狐仙老婆剧情介绍