青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

pthread_join函數(shù)及linux線程

pthread_join使一個(gè)線程等待另一個(gè)線程結(jié)束。

 

代碼中如果沒有pthread_join主線程會(huì)很快結(jié)束從而使整個(gè)進(jìn)程結(jié)束,從而使創(chuàng)建的線程沒有機(jī)會(huì)開始執(zhí)行就結(jié)束了。加入pthread_join后,主線程會(huì)一直等待直到等待的線程結(jié)束自己才結(jié)束,使創(chuàng)建的線程有機(jī)會(huì)執(zhí)行。

 

所有線程都有一個(gè)線程號(hào),也就是Thread ID。其類型為pthread_t。通過調(diào)用pthread_self()函數(shù)可以獲得自身的線程號(hào)。

 

下面說一下如何創(chuàng)建一個(gè)線程。

 

通過創(chuàng)建線程,線程將會(huì)執(zhí)行一個(gè)線程函數(shù),該線程格式必須按照下面來聲明:

 

       void * Thread_Function(void *)

 

創(chuàng)建線程的函數(shù)如下:

 

       int pthread_create(pthread_t *restrict thread,

 

              const pthread_attr_t *restrict attr,

 

              void *(*start_routine)(void*), void *restrict arg);

 

下面說明一下各個(gè)參數(shù)的含義:

 

thread:所創(chuàng)建的線程號(hào)。

 

attr:所創(chuàng)建的線程屬性,這個(gè)將在后面詳細(xì)說明。

 

start_routine:即將運(yùn)行的線程函數(shù)。

 

art:傳遞給線程函數(shù)的參數(shù)。

 

下面是一個(gè)簡(jiǎn)單的創(chuàng)建線程例子:

 

#include <pthread.h>

 

#include <stdio.h>

 

/* Prints x’s to stderr. The parameter is unused. Does not return. */

 

void* print_xs (void* unused)

 

{

 

while (1)

 

fputc (‘x’, stderr);

 

return NULL;

 

}

 

/* The main program. */

 

int main ()

 

{

 

pthread_t thread_id;

 

/* Create a new thread. The new thread will run the print_xs

 

function. */

 

pthread_create (&thread_id, NULL, &print_xs, NULL);

 

/* Print o’s continuously to stderr. */

 

while (1)

 

fputc (‘o’, stderr);

 

return 0;

 

}

 

 

在編譯的時(shí)候需要注意,由于線程創(chuàng)建函數(shù)在libpthread.so庫中,所以在編譯命令中需要將該庫導(dǎo)入。命令如下:

 

gcc –o createthread –lpthread createthread.c

 

如果想傳遞參數(shù)給線程函數(shù),可以通過其參數(shù)arg,其類型是void *。如果你需要傳遞多個(gè)參數(shù)的話,可以考慮將這些參數(shù)組成一個(gè)結(jié)構(gòu)體來傳遞。另外,由于類型是void *,所以你的參數(shù)不可以被提前釋放掉。

 

下面一個(gè)問題和前面創(chuàng)建進(jìn)程類似,不過帶來的問題回避進(jìn)程要嚴(yán)重得多。如果你的主線程,也就是main函數(shù)執(zhí)行的那個(gè)線程,在你其他縣城推出之前就已經(jīng)退出,那么帶來的bug則不可估量。通過pthread_join函數(shù)會(huì)讓主線程阻塞,直到所有線程都已經(jīng)退出。

 

int pthread_join(pthread_t thread, void **value_ptr);

 

thread:等待退出線程的線程號(hào)。

 

value_ptr:退出線程的返回值。

 

下面一個(gè)例子結(jié)合上面的內(nèi)容:

 

int main ()

 

{

 

pthread_t thread1_id;

 

pthread_t thread2_id;

 

struct char_print_parms thread1_args;

 

struct char_print_parms thread2_args;

 

/* Create a new thread to print 30,000 x’s. */

 

thread1_args.character = ’x’;

 

thread1_args.count = 30000;

 

pthread_create (&thread1_id, NULL, &char_print, &thread1_args);

 

/* Create a new thread to print 20,000 o’s. */

 

thread2_args.character = ’o’;

 

thread2_args.count = 20000;

 

pthread_create (&thread2_id, NULL, &char_print, &thread2_args);

 

/* Make sure the first thread has finished. */

 

pthread_join (thread1_id, NULL);

 

/* Make sure the second thread has finished. */

 

pthread_join (thread2_id, NULL);

 

/* Now we can safely return. */

 

return 0;

 

}

 

 

下面說一下前面提到的線程屬性。

 

在我們前面提到,可以通過pthread_join()函數(shù)來使主線程阻塞等待其他線程退 出,這樣主線程可以清理其他線程的環(huán)境。但是還有一些線程,更喜歡自己來清理退出的狀態(tài),他們也不愿意主線程調(diào)用pthread_join來等待他們。我 們將這一類線程的屬性稱為detached。如果我們?cè)谡{(diào)用pthread_create()函數(shù)的時(shí)候?qū)傩栽O(shè)置為NULL,則表明我們希望所創(chuàng)建的線 程采用默認(rèn)的屬性,也就是jionable。如果需要將屬性設(shè)置為detached,則參考下面的例子:

 

#include <stdio.h>

 

#include <pthread.h>

 

void * start_run(void * arg)

 

{

 

        //do some work

 

}

 

int main()

 

{

 

        pthread_t thread_id;

 

        pthread_attr_t attr;

 

        pthread_attr_init(&attr);

 

        pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

 

        pthread_create(&thread_id,&attr,start_run,NULL);

 

        pthread_attr_destroy(&attr);

 

        sleep(5);

 

        exit(0);

 

}

 

 

在線程設(shè)置為joinable后,可以調(diào)用pthread_detach()使之成為detached。但是相反的操作則不可以。還有,如果線程已經(jīng)調(diào)用pthread_join()后,則再調(diào)用pthread_detach()則不會(huì)有任何效果。

 

線程可以通過自身執(zhí)行結(jié)束來結(jié)束,也可以通過調(diào)用pthread_exit()來結(jié)束線程的執(zhí)行。另外,線程甲可以被線程乙被動(dòng)結(jié)束。這個(gè)通過調(diào)用pthread_cancel()來達(dá)到目的。

 

int pthread_cancel(pthread_t thread);

 

       函數(shù)調(diào)用成功返回0

 

當(dāng)然,線程也不是被動(dòng)的被別人結(jié)束。它可以通過設(shè)置自身的屬性來決定如何結(jié)束。

 

線程的被動(dòng)結(jié)束分為兩種,一種是異步終結(jié),另外一種是同步終結(jié)。異步終結(jié)就是當(dāng)其他線程調(diào)用 pthread_cancel的時(shí)候,線程就立刻被結(jié)束。而同步終結(jié)則不會(huì)立刻終結(jié),它會(huì)繼續(xù)運(yùn)行,直到到達(dá)下一個(gè)結(jié)束點(diǎn)(cancellation point)。當(dāng)一個(gè)線程被按照默認(rèn)的創(chuàng)建方式創(chuàng)建,那么它的屬性是同步終結(jié)。

 

通過調(diào)用pthread_setcanceltype()來設(shè)置終結(jié)狀態(tài)。

 

int pthread_setcanceltype(int type, int *oldtype);

 

state:要設(shè)置的狀態(tài),可以為PTHREAD_CANCEL_DEFERRED或者為PTHREAD_CANCEL_ASYNCHRONOUS

 

那么前面提到的結(jié)束點(diǎn)又是如何設(shè)置了?最常用的創(chuàng)建終結(jié)點(diǎn)就是調(diào)用pthread_testcancel()的地方。該函數(shù)除了檢查同步終結(jié)時(shí)的狀態(tài),其他什么也不做。

 

上面一個(gè)函數(shù)是用來設(shè)置終結(jié)狀態(tài)的。還可以通過下面的函數(shù)來設(shè)置終結(jié)類型,即該線程可不可以被終結(jié):

 

int pthread_setcancelstate(int state, int *oldstate);

 

       state:終結(jié)狀態(tài),可以為PTHREAD_CANCEL_DISABLE或者PTHREAD_CANCEL_ENABLE。具體什么含義大家可以通過單詞意思即可明白。

 

最后說一下線程的本質(zhì)。其實(shí)在Linux中,新建的線程并不是在原先的進(jìn)程中,而是系統(tǒng)通過 一個(gè)系統(tǒng)調(diào)用clone()。該系統(tǒng)copy了一個(gè)和原先進(jìn)程完全一樣的進(jìn)程,并在這個(gè)進(jìn)程中執(zhí)行線程函數(shù)。不過這個(gè)copy過程和fork不一樣。 copy后的進(jìn)程和原先的進(jìn)程共享了所有的變量,運(yùn)行環(huán)境。這樣,原先進(jìn)程中的變量變動(dòng)在copy后的進(jìn)程中便能體現(xiàn)出來。


from:

http://blog.csdn.net/jxxfqyy/archive/2009/04/16/4084193.aspx

posted on 2010-08-24 18:01 chatler 閱讀(2647) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲伊人一本大道中文字幕| 亚洲电影第三页| 亚洲影视在线播放| 在线一区二区日韩| 国产日韩欧美高清| 久久影院午夜论| 欧美国产日韩一区二区在线观看 | 翔田千里一区二区| 国内久久婷婷综合| 亚洲国产高清一区| 欧美精品 国产精品| 亚洲一区欧美一区| 久久久福利视频| 亚洲免费电影在线| 亚洲欧美日韩中文视频| 黄网动漫久久久| 亚洲日本一区二区| 国产欧美激情| 亚洲韩国日本中文字幕| 国产精品免费在线| 欧美成人一区二区三区片免费| 欧美日韩国产色综合一二三四| 久久精品国产综合| 欧美精品一区在线| 久久久水蜜桃| 国产精品v亚洲精品v日韩精品 | 亚洲国产专区校园欧美| 亚洲精品中文字幕在线| 极品av少妇一区二区| 亚洲精品一区二区三区av| 国产亚洲欧美日韩美女| 亚洲精品视频一区二区三区| 合欧美一区二区三区| 亚洲蜜桃精久久久久久久| 一区二区三区自拍| 亚洲一区视频在线观看视频| 亚洲破处大片| 久久久久久久国产| 久久国产精品一区二区三区四区| 欧美激情视频在线免费观看 欧美视频免费一 | 毛片一区二区| 久久精品72免费观看| 欧美区二区三区| 欧美国产精品中文字幕| 国产亚洲a∨片在线观看| 99re66热这里只有精品4| 亚洲韩国日本中文字幕| 欧美一区网站| 欧美亚洲一级| 国产精品乱码一区二区三区| 亚洲伦理在线免费看| 91久久久亚洲精品| 亚洲一区日韩| 亚洲欧美国内爽妇网| 欧美精品激情blacked18| 欧美69wwwcom| 影音先锋亚洲电影| 久久精品官网| 久久久久久网址| 国产在线精品成人一区二区三区| 亚洲图片在线观看| 午夜日韩激情| 国产精品视频99| 亚洲专区一区| 欧美一区二区三区另类| 国产农村妇女精品一二区| 亚洲桃色在线一区| 午夜一级在线看亚洲| 国产嫩草一区二区三区在线观看| 亚洲永久精品大片| 久久国产精品亚洲77777| 国产性做久久久久久| 欧美专区中文字幕| 欧美freesex8一10精品| 亚洲第一精品福利| 欧美精品97| 在线综合亚洲| 久久先锋资源| 亚洲成人直播| 欧美日韩99| 亚洲欧美日本国产有色| 久久手机免费观看| 亚洲欧洲另类| 国产精品国产三级国产专区53| 亚洲欧美日韩综合aⅴ视频| 久久精品一区二区| 亚洲国产精品一区二区www| 欧美精品偷拍| 性色av一区二区三区| 欧美+亚洲+精品+三区| 亚洲激情视频| 国产精品久久久久影院亚瑟| 久久精品国产2020观看福利| 亚洲国产成人一区| 亚洲欧美日韩国产| 在线日韩中文| 国产精品黄色| 久久夜色精品国产欧美乱| 亚洲美女在线视频| 久久人人精品| 一区二区av在线| 狠狠久久亚洲欧美专区| 欧美精品不卡| 久久久99爱| 一区二区冒白浆视频| 免费在线观看精品| 午夜精品理论片| 亚洲精品在线视频观看| 国产欧美精品| 欧美日韩麻豆| 美女亚洲精品| 欧美在线免费观看亚洲| 99这里只有久久精品视频| 麻豆久久婷婷| 欧美一区二区观看视频| 一本久道久久综合中文字幕| 精品二区视频| 国产乱码精品| 欧美日韩理论| 欧美激情亚洲精品| 老司机免费视频一区二区三区| 亚洲欧美日韩一区二区| 99在线精品视频| 欧美日韩国语| 久久久久se| 一本色道综合亚洲| 亚洲日本国产| 欧美黄色片免费观看| 久久综合久久久| 久久狠狠亚洲综合| 午夜久久资源| 午夜伦欧美伦电影理论片| 在线亚洲一区二区| 一区二区三区四区五区精品| 亚洲精品视频免费| 91久久线看在观草草青青| 在线播放不卡| 91久久在线视频| 亚洲破处大片| 99热这里只有成人精品国产| 亚洲乱码一区二区| 夜夜狂射影院欧美极品| 一区二区欧美激情| 一区二区欧美日韩视频| 亚洲视频一起| 亚洲欧美日本日韩| 欧美亚洲一级片| 久久国产日韩欧美| 久久这里只有精品视频首页| 久久美女艺术照精彩视频福利播放| 欧美有码在线视频| 美女国产精品| 亚洲国产一区在线| aa级大片欧美| 亚洲在线视频| 久久久久久久久久看片| 米奇777在线欧美播放| 欧美国产亚洲另类动漫| 欧美日韩三级视频| 国产欧美va欧美不卡在线| 国外成人性视频| 亚洲精品国精品久久99热| 亚洲午夜羞羞片| 久久精品视频va| 亚洲高清自拍| 亚洲一区二区精品在线观看| 久久精品91| 欧美日韩一二区| 国产一区二区三区在线观看精品| 在线欧美小视频| 宅男66日本亚洲欧美视频| 欧美中文字幕| 亚洲韩国精品一区| 亚洲欧美国产精品专区久久| 久久视频在线视频| 欧美日韩在线观看视频| 国产一区二区高清视频| 日韩一区二区精品在线观看| 亚洲午夜在线视频| 久久久噜噜噜久久狠狠50岁| 亚洲精品日韩久久| 久久精品卡一| 欧美丝袜第一区| 136国产福利精品导航| 亚洲伊人伊色伊影伊综合网| 欧美成人一品| 性18欧美另类| 欧美色综合天天久久综合精品| 韩日欧美一区二区| 亚洲欧美日韩国产| 亚洲电影中文字幕| 欧美一区二区日韩一区二区| 欧美激情综合| 亚洲成人在线观看视频| 新狼窝色av性久久久久久| 亚洲精品日本| 免费黄网站欧美| 精品96久久久久久中文字幕无| 午夜在线视频一区二区区别| 亚洲黄色免费|