婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux 多線程編程實(shí)例

Linux 多線程編程實(shí)例

熱門標(biāo)簽:常熟外呼系統(tǒng) 江蘇小型外呼系統(tǒng)軟件 百度地圖標(biāo)注未成功 拉薩銷售外呼系統(tǒng)軟件 文山外呼營銷系統(tǒng) 中山防封卡電銷卡辦理 地圖上標(biāo)注點(diǎn)位的圖標(biāo) 電話機(jī)器人服務(wù)器部署 電銷語音機(jī)器人哪個(gè)好

一、多線程 VS 多進(jìn)程

和進(jìn)程相比,線程有很多優(yōu)勢。在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)代碼段和數(shù)據(jù)。而運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程,他們之間使用相同的地址空間。正是這樣,同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,數(shù)據(jù)可以相互使用,并且線程間切換也要更快些,可以更有效的利用CPU。

二、程序設(shè)計(jì)

[注] 頭文件pthread.h> 編譯時(shí)要加載動(dòng)態(tài)庫 libpthread.a,使用 -lpthread
 
1、創(chuàng)建線程
2、等待線程
3、關(guān)閉線程
4、退出清除
 
1、創(chuàng)建線程

復(fù)制代碼
代碼如下:

int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void), void *arg)

tidp為線程id,是函數(shù)分配的值,所以要傳一個(gè) pthread_t 的地址。
attr線程屬性,通常為空。
start_rtn為線程要執(zhí)行的函數(shù),返回值為空指針,參數(shù)為后面的*arg
若成功則返回0,否則返回出錯(cuò)編號。
 
例:


復(fù)制代碼
代碼如下:

#includestdio.h>
#includepthread.h>/p> p>void *func1(void *arg){ //原函數(shù)聲明
int i;
for(i=0;i5;i++){
printf("this is func1! The num is %d\n",*(int*)arg); //將空指針轉(zhuǎn)換為int型指針
sleep(1);
}
}/p> p>void *func2(int *m){ //自定義類型聲明,也可以定義非指針類型,但是在create時(shí)會有警告,因?yàn)榉堑刂凡⒉荒芨淖儌魅氲闹?br /> int i;
for(i=0;i5;i++){
printf("this is func2! The num is %d\n",*m);
(*m)++;
sleep(1);
}
}/p> p>int main(){
pthread_t id1,id2;
int num = 5;
int *p = num;
if(pthread_create(id1,NULL,(void *)func1,(void *)p) != 0){
printf("thread1 create error!\n");
return -1;
}
if(pthread_create(id2,NULL,(void *)func2,num) != 0){
printf("thread2 create error!\n");
return -1;
}
pthread_join(id1,NULL); //等待線程結(jié)束
pthread_join(id2,NULL);
printf("Running complete!\n");
return 0;/p> p>
}

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


復(fù)制代碼
代碼如下:

[fsy@localhost process]$ gcc thC.c -o thC -lpthread -g
[fsy@localhost process]$ ./thC
this is func2! The num is 5
this is func1! The num is 6
this is func2! The num is 6
this is func1! The num is 7
this is func2! The num is 7
this is func1! The num is 8
this is func2! The num is 8
this is func1! The num is 9
this is func2! The num is 9
this is func1! The num is 10
Running complete!
[fsy@localhost process]$


2、等待線程

[注]當(dāng)調(diào)用pthread_create函數(shù)時(shí),線程并沒有開始執(zhí)行,主進(jìn)程應(yīng)有等待,比如用sleep,或者用更專業(yè)的函數(shù):pthread_join

復(fù)制代碼
代碼如下:

int pthread_join(pthread_t tid, void **rval_ptr)

調(diào)用函數(shù)可以阻塞調(diào)用線程,直到指定的線程終止。
tid為等待退出線程的id,rval_ptr為函數(shù)的返回值。是指向指針的指針,可以置空。
 
例:

復(fù)制代碼
代碼如下:

#includestdio.h>
#includepthread.h>
#includestdlib.h>/p> p>void *func(int *p){
int *num=(int *)malloc(sizeof(int)); //必須動(dòng)態(tài)創(chuàng)建,原因可以參考我動(dòng)態(tài)分配內(nèi)存的博客
printf("Please input the number: ");
scanf("%d",num);
return (void *)num; //類型是pthread_create的參數(shù)規(guī)定的
}/p> p>int main(){
pthread_t pth;
void *a;
if(pthread_create(pth,NULL,(void *)func,NULL) != 0){
printf("create thread error!\n");
return 1;
}
pthread_join(pth,a); //指向空指針的指針
printf("get the num from the thread, it's %d\n",*(int *)a);
return 0;
}

3、終止線程

線程終止有以下三種方式:

1、線程從函數(shù)中返回
2、線程可以別其他函數(shù)終止
3、線程自己調(diào)用pthread_exit函數(shù)

復(fù)制代碼
代碼如下:

void pthread_exit(void *rval_ptr)

rval_ptr為線程退出返回值的指針,即函數(shù)返回值。

4、退出清除

復(fù)制代碼
代碼如下:

void pthread_cleanup_push(void (*rtn)(void*), void *arg)

rtn為清除函數(shù),arg是清除函數(shù)的參數(shù)

復(fù)制代碼
代碼如下:

void pthread_cleanup_pop(int execute)

當(dāng)execute 非0時(shí)執(zhí)行清除函數(shù)。為0時(shí)不執(zhí)行。

從pthread_cleanup_push的調(diào)用點(diǎn)到pthread_cleanup_pop之間的程序段中,如果有終止進(jìn)程的動(dòng)作,如調(diào)用pthread_exit或異常終止(不包括return),就會執(zhí)行pthread_cleanup_push()所指定的清理函數(shù)。多個(gè)嵌套匹配時(shí),就近匹配。
 
例:

復(fù)制代碼
代碼如下:

#includestdio.h>
#includepthread.h>/p> p>void *clean(char *argv){
printf("clean is called by %s\n",argv);
return NULL;
}
void *func1(void *argv){
printf("welcome enter the func1!\n");
pthread_cleanup_push((void*)clean,"the first time call!");
pthread_cleanup_push((void*)clean,"the second time call!");
if(argv){
return (void *)1; //第二次運(yùn)行將此句注掉
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(1);
return (void *)0;
}/p> p>void *func2(void *argv){
sleep(1); //兩個(gè)線程運(yùn)行先后不確定
printf("welcome enter the func2!\n");
pthread_cleanup_push((void*)clean,"the first time call!");
pthread_cleanup_push((void*)clean,"the second time call!");
if(argv){
pthread_exit(NULL);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)0;
}/p> p>
int main(){
pthread_t tid1,tid2;
if(pthread_create(tid1,NULL,(void *)func1,(void *)1) != 0){
printf("thread1 create error!\n");
return 1;
}/p> p> if(pthread_create(tid2,NULL,(void *)func2,(void *)1) != 0){
printf("thread2 create error!\n");
return 1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}

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

復(fù)制代碼
代碼如下:

[fsy@localhost process]$ gcc thClean.c -o thclean -lpthread
[fsy@localhost process]$ ./thclean
welcome enter the func1!
welcome enter the func2!
clean is called by the second time call! //此處先2后1
clean is called by the first time call!
[fsy@localhost process]$ vim thClean.c
[fsy@localhost process]$ gcc thClean.c -o thclean -lpthread
[fsy@localhost process]$ ./thclean
welcome enter the func1!
clean is called by the first time call! //second已經(jīng)被pop
welcome enter the func2!
clean is called by the second time call!
clean is called by the first time call!
[fsy@localhost process]$

標(biāo)簽:和田 石家莊 馬鞍山 法律問答 開封 和田 湖南 淮安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux 多線程編程實(shí)例》,本文關(guān)鍵詞  Linux,多,線程,編程,實(shí)例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux 多線程編程實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux 多線程編程實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品1区2区| 麻豆精品在线视频| 中文字幕永久在线不卡| 国产经典欧美精品| 日本久久精品电影| 日韩精品一区二区三区蜜臀| 欧美精品一区二区三区高清aⅴ| 精品国内片67194| 国产喂奶挤奶一区二区三区| 一区二区三区av电影| 另类小说一区二区三区| 国产一区二区三区| 欧美午夜精品免费| 国产精品久久久久一区| 精品在线一区二区| 日韩一级大片在线观看| 亚洲一区二区五区| 韩国女主播一区| 欧美大胆一级视频| 日韩综合小视频| 日韩欧美一级二级三级| 男女男精品网站| 日韩国产在线一| 久久99精品视频| 5566中文字幕一区二区电影 | 波多野结衣视频一区| 欧美肥大bbwbbw高潮| 国产精品午夜免费| 亚洲午夜一二三区视频| 欧美日韩精品欧美日韩精品一 | 色综合久久中文综合久久牛| 综合久久久久久| 亚洲国产aⅴ成人精品无吗| 91黄视频在线| 亚洲永久精品国产| 色综合天天天天做夜夜夜夜做| 日韩免费高清电影| 国产成人av一区| 91久久线看在观草草青青| 亚洲最新在线观看| 6080国产精品一区二区| 91久久精品一区二区三区| 日韩和欧美一区二区三区| 日韩你懂的在线播放| 国产一区二区三区视频在线播放| 一区二区激情视频| 欧美激情一区二区三区四区| 成人在线一区二区三区| 亚洲一区av在线| 亚洲美女视频在线观看| 久久人人超碰精品| 欧美电影免费观看高清完整版在线观看| 日韩主播视频在线| 精品免费视频一区二区| 91在线观看高清| 丰满放荡岳乱妇91ww| 同产精品九九九| 日本三级亚洲精品| 狠狠久久亚洲欧美| 日本欧美一区二区| 亚洲精品免费看| 亚洲国产精品久久不卡毛片| 中文字幕精品—区二区四季| 91精品国产综合久久久久| av中文字幕亚洲| 色综合久久中文综合久久牛| 国产不卡视频一区| 国产不卡在线视频| 欧美一级免费大片| 国产欧美一区二区精品忘忧草 | 色av成人天堂桃色av| 欧美性色黄大片手机版| 精品乱码亚洲一区二区不卡| 国产色婷婷亚洲99精品小说| 国产农村妇女毛片精品久久麻豆 | 亚洲视频一区二区在线| 亚洲a一区二区| 精彩视频一区二区| 成人av在线一区二区| 成人app在线| 奇米777欧美一区二区| 成人精品高清在线| 国产欧美精品一区二区色综合朱莉| 亚洲一区二区三区四区在线免费观看| 天天综合色天天综合色h| 91视频www| 精品国产乱码久久久久久图片| 亚洲一区二区三区在线播放| 国产精品一区专区| 99久久精品国产观看| 亚洲综合小说图片| 91麻豆福利精品推荐| 日韩一区欧美一区| 成人看片黄a免费看在线| 国产午夜亚洲精品不卡| 狠狠色狠狠色合久久伊人| 在线播放视频一区| 亚洲欧洲一区二区三区| 国产麻豆精品视频| 亚洲精品在线一区二区| 极品尤物av久久免费看| 91精品国产手机| 亚洲成人先锋电影| 欧美一级日韩一级| 国产麻豆视频精品| 国产欧美日韩久久| 欧美日韩久久一区二区| 亚洲人吸女人奶水| 一本到高清视频免费精品| 国产精品美女久久久久高潮| 国产剧情一区二区三区| 午夜私人影院久久久久| 精品国产乱码久久久久久久久| 人人超碰91尤物精品国产| 欧美另类变人与禽xxxxx| 国产一区二区三区在线看麻豆| 美女一区二区久久| 麻豆精品视频在线观看视频| 免费成人在线视频观看| 国产精品1024| 亚洲精选在线视频| 精品一区二区精品| 国产精品一区二区久久精品爱涩 | 国产精品二三区| 国产精品久久毛片| 亚洲国产视频一区| 亚洲一卡二卡三卡四卡五卡| 日本美女一区二区三区| 国产精一区二区三区| 日本在线不卡一区| 欧洲精品中文字幕| 久久色成人在线| 中文字幕亚洲一区二区av在线 | 美女脱光内衣内裤视频久久网站| 日本不卡不码高清免费观看| 久久成人羞羞网站| 麻豆国产欧美一区二区三区| 亚洲欧洲三级电影| 亚洲色图在线看| 热久久一区二区| 理论片日本一区| 国产精品18久久久久久vr| 国产成人亚洲综合a∨猫咪| 国产经典欧美精品| 99国产精品国产精品久久| 一区二区三区美女| 五月婷婷久久综合| 日本aⅴ免费视频一区二区三区| 亚洲国产精品久久久久秋霞影院 | 欧美一级日韩一级| 欧美性色综合网| 91精品国产高清一区二区三区蜜臀| 6080yy午夜一二三区久久| 欧美精品一区视频| 亚洲精选一二三| av网站一区二区三区| 日韩欧美电影一二三| 亚洲精品自拍动漫在线| 久久嫩草精品久久久精品| 亚洲狼人国产精品| 在线日韩国产精品| 久久综合色综合88| 青青草原综合久久大伊人精品 | 亚洲精品一线二线三线| 成人免费看的视频| 久久成人久久鬼色| 91麻豆国产香蕉久久精品| 偷拍亚洲欧洲综合| 91精品1区2区| 美国一区二区三区在线播放| 国产一区中文字幕| 日韩午夜精品电影| 蜜臀久久99精品久久久久久9 | 亚洲福利一区二区| 日本福利一区二区| 在线播放一区二区三区| 国产夫妻精品视频| 国产精品色呦呦| 成人av电影免费在线播放| 亚洲欧美日韩国产手机在线| 色婷婷国产精品久久包臀 | www.一区二区| 丝袜诱惑制服诱惑色一区在线观看| 欧美视频在线观看一区二区| 一区二区三区美女视频| 欧美日韩一卡二卡三卡 | 日本欧美在线看| 日本电影欧美片| 日本中文一区二区三区| 精品久久久久av影院| 不卡av免费在线观看| 亚洲一区二区三区国产| 欧美一级欧美一级在线播放| 国产精选一区二区三区| 中文字幕一区二区在线观看| 狠狠色综合色综合网络| 国产精品乱人伦| 欧美午夜电影在线播放| 九九国产精品视频| 国产精品久久久久久久久搜平片|