多线程之pthread_create()函数
生活随笔
收集整理的這篇文章主要介紹了
多线程之pthread_create()函数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
總述:pthread_create是(Unix、Linux、Mac OS X)等操作系統(tǒng)的創(chuàng)建線程的函數(shù)。它的功能是創(chuàng)建線程(實(shí)際上就是確定調(diào)用該線程函數(shù)的入口點(diǎn)),在線程創(chuàng)建以后,就開始運(yùn)行相關(guān)的線程函數(shù)。
pthread_create的返回值表示成功,返回0;表示出錯(cuò),返回表示-1。
pthread_create函數(shù)如何創(chuàng)造線程
函數(shù)原型聲明:
#include <pthread.h> int pthread_create(pthread_t *restrict tidp, //新創(chuàng)建的線程ID指向的內(nèi)存單元。const pthread_attr_t *restrict attr, //線程屬性,默認(rèn)為NULLvoid *(*start_rtn)(void *), //新創(chuàng)建的線程從start_rtn函數(shù)的地址開始運(yùn)行void *restrict arg //默認(rèn)為NULL。若上述函數(shù)需要參數(shù),將參數(shù)放入結(jié)構(gòu)中并將地址作為arg傳入。);1.傳遞參數(shù)注意的問(wèn)題
問(wèn)題:
避免直接在傳遞的參數(shù)中傳遞發(fā)生改變的量,否則會(huì)導(dǎo)致結(jié)果不可測(cè)。
即使是只再創(chuàng)造一個(gè)單線程,也可能在線程未獲取傳遞參數(shù)時(shí),線程獲取的變量值已經(jīng)被主線程進(jìn)行了修改。
通常解決方案:
重新申請(qǐng)一塊內(nèi)存,存入需要傳遞的參數(shù),再將這個(gè)地址作為arg傳入。
2.使用時(shí)注意防止內(nèi)存泄漏
在默認(rèn)情況下通過(guò)pthread_create函數(shù)創(chuàng)建的線程是非分離屬性的,由pthread_create函數(shù)的第二個(gè)參數(shù)決定,在非分離的情況下,當(dāng)一個(gè)線程結(jié)束的時(shí)候,它所占用的系統(tǒng)資源并沒(méi)有完全真正的釋放,也沒(méi)有真正終止。
只有在pthread_join函數(shù)返回時(shí),該線程才會(huì)釋放自己的資源。 或者是設(shè)置在分離屬性的情況下,一個(gè)線程結(jié)束會(huì)立即釋放它所占用的資源。2. 配套使用pthread_join函數(shù)
pthread_join()函數(shù)會(huì)一直阻塞調(diào)用線程,直到指定的線程終止。當(dāng)pthread_join()返回之后,應(yīng)用程序可回收與已終止線程關(guān)聯(lián)的任何數(shù)據(jù)存儲(chǔ)空間。
但是,同時(shí)需要注意,一定要和上面創(chuàng)建的某一線程配套使用,這樣還可以起到互斥的作用。否則多線程可能搶占CPU資源,導(dǎo)致運(yùn)行結(jié)果不確定。
牛客一道題目: 下面程序輸出結(jié)果是什么?(不能確定)
#include<stdio.h> #include<string.h> #include <pthread.h>void* print1(void* data){printf("1 "); }void* print2(void* data){printf("2 "); }void* print3(void* data){printf("3 "); }int main(void){pthread_t t,t1,t2;pthread_create(&t,0,print1,NULL);pthread_create(&t1,0,print2,NULL);pthread_create(&t2,0,print3,NULL);pthread_join(t,NULL);pthread_join(t1,NULL);pthread_join(t2,NULL);printf("\n"); }分析:
在pthread_join()之前,3個(gè)線程都已提交,它們可能都已經(jīng)順序隨機(jī)地執(zhí)行了,也可能沒(méi)有,所以結(jié)果也是不可預(yù)測(cè)的。不過(guò)這樣也可以起到回收內(nèi)存的作用吧?
//這樣才是按順序的。 pthread_create(&t, 0, print1, NULL); pthread_join(t, NULL); pthread_create(&t1, 0, print2, NULL); pthread_join(t1, NULL); pthread_create(&t2, 0, print3, NULL); pthread_join(t2, NULL);補(bǔ)充:pthread_join()函數(shù)
函數(shù)原型:
int pthread_join(pthread_t tid, //需要等待的線程,指定的線程必須位于當(dāng)前的進(jìn)程中,而且不得是分離線程void **status //線程tid所執(zhí)行的函數(shù)返回值(返回值地址需要保證有效),其中status可以為NULL);pthread非linux系統(tǒng)的默認(rèn)庫(kù), 需手動(dòng)鏈接-線程庫(kù) -lpthread
返回值:
調(diào)用成功返回0.
ESRCH
描述: 沒(méi)有找到與給定的線程ID 相對(duì)應(yīng)的線程。(如果多個(gè)線程等待同一個(gè)線程終止,則所有等待線程將一直等到目標(biāo)線程終止。然后一個(gè)等待線程成功返回。其余的等待線程將失敗返回ESRCH錯(cuò)誤)
EDEADLK
描述: 將出現(xiàn)死鎖,如一個(gè)線程等待其本身,或者線程A和線程B 互相等待。
EINVAL
描述: 與給定的線程ID相對(duì)應(yīng)的線程是分離線程。
總結(jié)
以上是生活随笔為你收集整理的多线程之pthread_create()函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。