C語(yǔ)言由淺入深講解線程的定義
線程的概念
可以簡(jiǎn)單理解為一個(gè)正在獨(dú)立運(yùn)行的函數(shù)
注:
1.posix線程是一套標(biāo)準(zhǔn)嗎,而不是實(shí)現(xiàn)
2.線程標(biāo)識(shí): phread_t,可能是整形也可能是結(jié)構(gòu)體指針等
*簡(jiǎn)單介紹關(guān)于線程標(biāo)識(shí)的函數(shù)*
*pthread_equarl() ;判斷兩個(gè)線程標(biāo)識(shí)是否相等*
*pthread_self();返回自身的線程標(biāo)識(shí)*
線程的創(chuàng)建
pthread_creat();
int pthread_create(
pthread_t *restrict tidp, //新創(chuàng)建的線程ID指向的內(nèi)存單元。
const pthread_attr_t *restrict attr, //線程屬性,默認(rèn)為NULL
void *(*start_rtn)(void *), //新創(chuàng)建的線程從start_rtn函數(shù)的地址開(kāi)始運(yùn)行
void *restrict arg //默認(rèn)為NULL。若上述函數(shù)需要參數(shù),將參數(shù)放入結(jié)構(gòu)中并將地址作為arg傳入。);
線程的調(diào)度取決于調(diào)度器策略
# include<stdlib.h> # include<pthread.h> static void* func(void* p) { puts("thread is working"); return NULL; } int main() { pthread_t tid; int err; puts("begin!"); err = pthread_create(&tid,NULL,func,NULL); if(err) { exit(-1); } puts("end!"); exit(0); }
線程的終止
3種方式 :
1)線程從啟動(dòng)歷程返回,返回值就是線程的退出碼
2)線程可以被同一進(jìn)程中的其他線程取消
3)線程可以調(diào)用 pthread)exit()函數(shù)
線程退出函數(shù)
void pthread_exit(void *value_ptr);
線程標(biāo)識(shí)的比較
獲取線程號(hào)
pthread_t pthread_self(void);
比較
int pthread_equal(pthread_t t1, pthread_t t2);
線程的取消
int pthread_cancel(pthread_t thread);
取消有兩種狀態(tài) : 允許和不允許
允許取消又分為: 異步cancel , 推遲 cancel(默認(rèn)) -> 推遲到cancel點(diǎn)
cancel點(diǎn): posix定義的canceldian 都是可能引發(fā)阻塞的系統(tǒng)調(diào)用
pthread_setcancelstate(int );//設(shè)置是否允許取消
pthread_setcanceltype(); //設(shè)置取消方式 異步還是推遲
注:pthread_cancel 調(diào)用具有具有一定的延時(shí)性,因?yàn)閏ancel點(diǎn): posix定義的canceldian 都是可能引發(fā)阻塞的系統(tǒng)調(diào)用,并不會(huì)立即被處理,不建議當(dāng)線程立即被創(chuàng)建后立即進(jìn)行cancel取消(線程創(chuàng)建,并不會(huì)立即被調(diào)度);也不建議在線程退出前執(zhí)行線程cancel取消(線程可能在取消之前就已經(jīng)退出了);建議在線程執(zhí)行中進(jìn)行cancel取消線程
void pthread_testcancel(void); //本函數(shù)為設(shè)置取消點(diǎn)
當(dāng)不關(guān)心線程的返回信息時(shí)可以直接使用線程分離函數(shù)進(jìn)行回收
反之,需要獲取線程的返回值時(shí),可以使用線程等待
線程等待
int pthread_join(pthread_t thread, void **value_ptr);
第一個(gè)參數(shù)是線程標(biāo)識(shí),第二是傳出型參數(shù)用來(lái)獲取線程的返回值
注意:
- 調(diào)用該函數(shù)的線程將掛起等待,直到id為thread的線程終止
- 這里獲取的線程退出信息并沒(méi)有終止信號(hào)信息,而終止信號(hào)信息是對(duì)于整個(gè)進(jìn)程來(lái)說(shuō)的,如果線程收到信號(hào)崩潰也會(huì)導(dǎo)致整個(gè)進(jìn)程也崩潰
- thread線程以不同的方法終止,通過(guò)pthread_join得到的終止?fàn)顟B(tài)是不同的
終止獲取的狀態(tài)情況:
- 如果thread線程通過(guò)return返回,value_ ptr所指向的單元里存放的是thread線程函數(shù)的返回值
- 如果thread線程被別的線程調(diào)用pthread_ cancel異常終掉,value_ ptr所指向的單元里存放的是常數(shù)PTHREAD_ CANCELED
- 如果thread線程是自己調(diào)用pthread_exit終止的,value_ptr所指向的單元存放的是傳給pthread_exit的參數(shù)
- 如果對(duì)thread線程的終止?fàn)顟B(tài)不感興趣,可以傳NULL給value_ ptr參數(shù)
線程分離
int pthread_detach(pthread_t thread);
默認(rèn)情況下,新創(chuàng)建的線程是joinable的,線程退出后,需要對(duì)其進(jìn)行pthread_join操作,否則無(wú)法釋放資源,從而造成系統(tǒng)泄漏
如果不關(guān)心線程的返回值,join是一種負(fù)擔(dān),這個(gè)時(shí)候,我們可以告訴系統(tǒng),當(dāng)線程退出時(shí),自動(dòng)釋放線程資源
注:
可以是線程組內(nèi)其他線程對(duì)目標(biāo)線程進(jìn)行分離,也可以是線程自己分離:
pthread_detach(pthread_self());
joinable和分離是沖突的,一個(gè)線程不能既是joinable又是分離的
線程的分離也是具有一定延時(shí)性,分離之后如果再進(jìn)行等待那么得到返回的結(jié)果是未定義的
線程分離后只是回收的時(shí)候自動(dòng)進(jìn)行回收,如果主線程先退出,那么整個(gè)進(jìn)程也會(huì)退出;如果分離的線程執(zhí)行崩潰,同樣的整個(gè)進(jìn)行也會(huì)崩潰
到此這篇關(guān)于C語(yǔ)言由淺入深講解線程的定義的文章就介紹到這了,更多相關(guān)C語(yǔ)言線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析
以下是對(duì)c語(yǔ)言中的雙鏈表進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08C++11中l(wèi)ambda、std::function和std:bind詳解
大家都知道C++11中增加了許多的新特性,下面在這篇文中我們就來(lái)聊一下lambda表達(dá)式,閉包,std::function以及std::bind。文中介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-01-01探討C++中不能聲明為虛函數(shù)的有哪些函數(shù)
下面小編就為大家?guī)?lái)一篇探討C++中不能聲明為虛函數(shù)的有哪些函數(shù)。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2017-01-01基于Matlab制作一個(gè)數(shù)獨(dú)求解器
這篇文章主要為大家詳細(xì)介紹了如何利用Matlab制作一個(gè)數(shù)獨(dú)求解器,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-05-05C++深入分析內(nèi)聯(lián)函數(shù)的使用
為了消除函數(shù)調(diào)用的時(shí)空開(kāi)銷,C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語(yǔ)言中的宏展開(kāi)。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)2022-04-04