溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解c線程中sleep()和pthread_join()函數(shù)

發(fā)布時(shí)間:2021-10-14 15:01:36 來(lái)源:億速云 閱讀:164 作者:柒染 欄目:編程語(yǔ)言

本篇文章為大家展示了如何理解c線程中sleep()和pthread_join()函數(shù),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

線程的執(zhí)行需要cpu資源,而cpu的利用時(shí)各個(gè)線程進(jìn)行“輪詢”即輪時(shí)間片,拋開優(yōu)先級(jí)不說(shuō),一個(gè)線程如果執(zhí)行的時(shí)候,分配給他的時(shí)間片到了,他就要交出cpu執(zhí)行權(quán),由其他等待cpu的線程來(lái)執(zhí)行,(一個(gè)cpu一次只能執(zhí)行一個(gè)線程)。

而sleep()的作用是讓當(dāng)前執(zhí)行cpu的線程掛起,交出cpu,讓其他等待cpu的線程執(zhí)行,

測(cè)試程序:

 1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void *fun(void *p){ 5     int i=0; 6     for(i;i<10;i++){ 7         printf("fun i=%d\n",i); 8     } 9     printf("fun bye bye\n");10     return NULL;11 }12 int main(){13     pthread_t th;14     if(pthread_create(&th,NULL,fun,NULL)<0){//pthread_create()函數(shù)參數(shù)請(qǐng)百度15         perror("pthread_create");16         return -1;17     }18     printf("main bye bye\n");19     return 0;20 }

如果是上面程序的話,在主線程main中沒(méi)有sleep()和pthread_join()函數(shù),猜一猜運(yùn)行結(jié)果如何,

如何理解c線程中sleep()和pthread_join()函數(shù)

對(duì),沒(méi)錯(cuò),只運(yùn)行了主線程main,那么如果在main函數(shù)中加入sleep()函數(shù)的話(sleep參數(shù)不是0),那么是否是我們想要的結(jié)果呢?

測(cè)試程序:

 1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void *fun(void *p){ 5     int i=0; 6     for(i;i<10;i++){ 7         printf("fun i=%d\n",i); 8     } 9     printf("fun bye bye\n");10     return NULL;11 }12 int main(){13     pthread_t th;14     if(pthread_create(&th,NULL,fun,NULL)<0){//pthread_create()函數(shù)參數(shù)請(qǐng)百度15         perror("pthread_create");16         return -1;17     }18     sleep(1);//參數(shù)不為019     printf("main bye bye\n");20     return 0;21 }

運(yùn)行結(jié)果:

如何理解c線程中sleep()和pthread_join()函數(shù)

果然是進(jìn)入子線程fun中執(zhí)行了,我猜操作系統(tǒng)是這樣運(yùn)行的:先是main線程,執(zhí)行,經(jīng)過(guò)create子線程的時(shí)候,創(chuàng)造出來(lái)的線程是就緒態(tài),在等待隊(duì)列中等待cpu的執(zhí)行,現(xiàn)在還是main線程執(zhí)行,在沒(méi)有sleep函數(shù)的時(shí)候,main執(zhí)行到return 0程序末尾的時(shí)候,main結(jié)束了,釋放了空間,這時(shí)候子線程fun由main創(chuàng)造出來(lái),主(進(jìn)程)釋放掉空間了,所以他就沒(méi)法執(zhí)行了;在main中有sleep函數(shù)的時(shí)候,main線程睡覺(jué)掛起了,把cpu交出來(lái)讓給其他等待執(zhí)行的線程去了,這時(shí)候子線程fun得以執(zhí)行,執(zhí)行完了,返回到main中繼續(xù)執(zhí)行。

由此猜想:如果他們都是在輪時(shí)間片的話,是否在main線程用光了時(shí)間片后會(huì)交出cpu執(zhí)行權(quán)呢?

測(cè)試程序:

 1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 int flag=1;//全局標(biāo)志位 5 void *fun(void *p){ 6     int i=0; 7     for(i;i<10;i++){ 8         printf("fun i=%d\n",i); 9     }10     printf("fun bye bye\n");11     flag=0;12     return NULL;13 }14 int main(){15     pthread_t th;16     if(pthread_create(&th,NULL,fun,NULL)<0){//pthread_create()函數(shù)參數(shù)請(qǐng)百度17         perror("pthread_create");18         return -1;19     }20 //    sleep(1);//這次不用sleep函數(shù),看是否main在用光了時(shí)間片后會(huì)交出時(shí)間片讓其他等待程序執(zhí)行呢21     int i=0;22     while(flag){23         printf("main i=%d\n",i++);24     }25     printf("main bye bye\n");26     return 0;27 }

運(yùn)行結(jié)果:

如何理解c線程中sleep()和pthread_join()函數(shù)

正如我們所想,在main線程中執(zhí)行while循環(huán),等到時(shí)間片用完了后,交出cpu有等待隊(duì)列中的線程執(zhí)行,然后fun執(zhí)行完了,交給主線程main再執(zhí)行。

總之:sleep函數(shù)的作用是讓本線程睡眠掛起,交出cpu資源,讓等待隊(duì)列中的處于就緒狀態(tài)的線程執(zhí)行,在哪個(gè)線程中調(diào)用sleep就讓哪個(gè)線程睡眠掛起。

上述內(nèi)容就是如何理解c線程中sleep()和pthread_join()函數(shù),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI