C語言由淺入深講解線程的定義
線程的概念
可以簡單理解為一個正在獨立運行的函數(shù)
注:
1.posix線程是一套標準嗎,而不是實現(xiàn)
2.線程標識: phread_t,可能是整形也可能是結(jié)構(gòu)體指針等
*簡單介紹關于線程標識的函數(shù)*
*pthread_equarl() ;判斷兩個線程標識是否相等*
*pthread_self();返回自身的線程標識*
線程的創(chuàng)建
pthread_creat();
int pthread_create(
pthread_t *restrict tidp, //新創(chuàng)建的線程ID指向的內(nèi)存單元。
const pthread_attr_t *restrict attr, //線程屬性,默認為NULL
void *(*start_rtn)(void *), //新創(chuàng)建的線程從start_rtn函數(shù)的地址開始運行
void *restrict arg //默認為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)線程從啟動歷程返回,返回值就是線程的退出碼
2)線程可以被同一進程中的其他線程取消
3)線程可以調(diào)用 pthread)exit()函數(shù)
線程退出函數(shù)
void pthread_exit(void *value_ptr);
線程標識的比較
獲取線程號
pthread_t pthread_self(void);
比較
int pthread_equal(pthread_t t1, pthread_t t2);
線程的取消
int pthread_cancel(pthread_t thread);
取消有兩種狀態(tài) : 允許和不允許
允許取消又分為: 異步cancel , 推遲 cancel(默認) -> 推遲到cancel點
cancel點: posix定義的canceldian 都是可能引發(fā)阻塞的系統(tǒng)調(diào)用
pthread_setcancelstate(int );//設置是否允許取消
pthread_setcanceltype(); //設置取消方式 異步還是推遲
注:pthread_cancel 調(diào)用具有具有一定的延時性,因為cancel點: posix定義的canceldian 都是可能引發(fā)阻塞的系統(tǒng)調(diào)用,并不會立即被處理,不建議當線程立即被創(chuàng)建后立即進行cancel取消(線程創(chuàng)建,并不會立即被調(diào)度);也不建議在線程退出前執(zhí)行線程cancel取消(線程可能在取消之前就已經(jīng)退出了);建議在線程執(zhí)行中進行cancel取消線程
void pthread_testcancel(void); //本函數(shù)為設置取消點
當不關心線程的返回信息時可以直接使用線程分離函數(shù)進行回收
反之,需要獲取線程的返回值時,可以使用線程等待
線程等待
int pthread_join(pthread_t thread, void **value_ptr);
第一個參數(shù)是線程標識,第二是傳出型參數(shù)用來獲取線程的返回值
注意:
- 調(diào)用該函數(shù)的線程將掛起等待,直到id為thread的線程終止
- 這里獲取的線程退出信息并沒有終止信號信息,而終止信號信息是對于整個進程來說的,如果線程收到信號崩潰也會導致整個進程也崩潰
- thread線程以不同的方法終止,通過pthread_join得到的終止狀態(tài)是不同的
終止獲取的狀態(tài)情況:
- 如果thread線程通過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ù)
- 如果對thread線程的終止狀態(tài)不感興趣,可以傳NULL給value_ ptr參數(shù)
線程分離
int pthread_detach(pthread_t thread);
默認情況下,新創(chuàng)建的線程是joinable的,線程退出后,需要對其進行pthread_join操作,否則無法釋放資源,從而造成系統(tǒng)泄漏
如果不關心線程的返回值,join是一種負擔,這個時候,我們可以告訴系統(tǒng),當線程退出時,自動釋放線程資源
注:
可以是線程組內(nèi)其他線程對目標線程進行分離,也可以是線程自己分離:
pthread_detach(pthread_self());
joinable和分離是沖突的,一個線程不能既是joinable又是分離的
線程的分離也是具有一定延時性,分離之后如果再進行等待那么得到返回的結(jié)果是未定義的
線程分離后只是回收的時候自動進行回收,如果主線程先退出,那么整個進程也會退出;如果分離的線程執(zhí)行崩潰,同樣的整個進行也會崩潰
到此這篇關于C語言由淺入深講解線程的定義的文章就介紹到這了,更多相關C語言線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c++連續(xù)輸入未知個數(shù)的數(shù)字操作
這篇文章主要介紹了c++連續(xù)輸入未知個數(shù)的數(shù)字操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
C++回調(diào)函數(shù)實現(xiàn)計算器和qsort
這篇文章主要介紹了C++回調(diào)函數(shù)實現(xiàn)計算器和qsort,回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)2022-08-08
Linux搭建C++開發(fā)調(diào)試環(huán)境的方法步驟
這篇文章主要介紹了Linux搭建C++開發(fā)調(diào)試環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
C++實現(xiàn)一個簡易版的事件(Event)的示例代碼
之前在?windows系統(tǒng)中開發(fā)應用時,?遇到需要進行線程同步的時候幾乎都是使用的事件內(nèi)核對象?Event。本文為大家整理了C++實現(xiàn)一個簡易版的事件(Event)的相關資料,需要的可以參考一下2022-11-11
VS2022實現(xiàn)VC++打包生成安裝文件圖文詳細歷程
本文主要介紹了VS2022實現(xiàn)VC++打包生成安裝文件圖文詳細歷程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

