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

posts - 297,  comments - 15,  trackbacks - 0

pthread_join函數(shù)及linux線(xiàn)程

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

 

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

 

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

 

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

 

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

 

       void * Thread_Function(void *)

 

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

 

       int pthread_create(pthread_t *restrict thread,

 

              const pthread_attr_t *restrict attr,

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

#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í)候需要注意,由于線(xiàn)程創(chuàng)建函數(shù)在libpthread.so庫(kù)中,所以在編譯命令中需要將該庫(kù)導(dǎo)入。命令如下:

 

gcc –o createthread –lpthread createthread.c

 

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

 

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

 

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

 

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

 

value_ptr:退出線(xiàn)程的返回值。

 

下面一個(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;

 

}

 

 

下面說(shuō)一下前面提到的線(xiàn)程屬性。

 

在我們前面提到,可以通過(guò)pthread_join()函數(shù)來(lái)使主線(xiàn)程阻塞等待其他線(xiàn)程退 出,這樣主線(xiàn)程可以清理其他線(xiàn)程的環(huán)境。但是還有一些線(xiàn)程,更喜歡自己來(lái)清理退出的狀態(tài),他們也不愿意主線(xiàn)程調(diào)用pthread_join來(lái)等待他們。我 們將這一類(lèi)線(xiàn)程的屬性稱(chēng)為detached。如果我們?cè)谡{(diào)用pthread_create()函數(shù)的時(shí)候?qū)傩栽O(shè)置為NULL,則表明我們希望所創(chuàng)建的線(xiàn) 程采用默認(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);

 

}

 

 

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

 

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

 

int pthread_cancel(pthread_t thread);

 

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

 

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

 

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

 

通過(guò)調(diào)用pthread_setcanceltype()來(lái)設(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ù)是用來(lái)設(shè)置終結(jié)狀態(tài)的。還可以通過(guò)下面的函數(shù)來(lái)設(shè)置終結(jié)類(lèi)型,即該線(xiàn)程可不可以被終結(jié):

 

int pthread_setcancelstate(int state, int *oldstate);

 

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

 

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


from:

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

posted on 2010-08-24 18:01 chatler 閱讀(2647) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Linux_Coding
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(10)

隨筆分類(lèi)(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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>
            亚洲国产清纯| 99国产精品私拍| 尤妮丝一区二区裸体视频| 欧美人与性动交a欧美精品| 久久国产精品99久久久久久老狼| 一区二区三区视频观看| 日韩性生活视频| 一区二区三区鲁丝不卡| 这里只有精品视频在线| 性欧美videos另类喷潮| 久久久久99| 欧美成人精品1314www| 欧美日韩精品欧美日韩精品一| 欧美日韩视频在线一区二区观看视频| 欧美日韩国产免费观看| 国产精品日韩电影| 激情久久综艺| 一本大道久久a久久精二百| 亚洲一级免费视频| 久久成人18免费观看| 美女999久久久精品视频| 亚洲乱码国产乱码精品精天堂| 亚洲在线日韩| 免费在线国产精品| 国产欧美精品日韩精品| 最新国产成人av网站网址麻豆| 亚洲线精品一区二区三区八戒| 久久久免费av| 一本大道久久a久久精品综合| 欧美一区二区日韩| 欧美精品一区二区三区很污很色的| 尤物九九久久国产精品的特点 | 亚洲第一综合天堂另类专| 亚洲精品免费看| 亚欧成人精品| 欧美日韩免费在线| 亚洲第一精品影视| 欧美在线观看日本一区| 亚洲精品一区二区三区樱花 | 日韩视频在线一区二区| 翔田千里一区二区| 亚洲欧洲一二三| 久久精品国产视频| 国产精品入口夜色视频大尺度| 亚洲日本理论电影| 另类专区欧美制服同性| 欧美午夜免费| 欧美亚男人的天堂| 亚洲精品视频在线看| 久久久免费精品视频| 亚洲素人一区二区| 欧美日韩 国产精品| 狠狠色噜噜狠狠狠狠色吗综合| 在线日韩av片| 久久精品亚洲乱码伦伦中文 | 亚洲美女在线国产| 欧美~级网站不卡| 久久电影一区| 国产日韩欧美精品| 欧美一激情一区二区三区| 日韩西西人体444www| 欧美高清视频免费观看| 亚洲激情在线视频| 欧美电影在线免费观看网站| 久久久久久久91| 国产一区久久久| 久久久久久网站| 久久精品视频亚洲| 韩国福利一区| 久久只精品国产| 久久中文久久字幕| 亚洲区一区二| 亚洲美女精品成人在线视频| 欧美日韩中文字幕日韩欧美| 亚洲一区中文字幕在线观看| 中文欧美日韩| 国产欧美日韩另类一区| 久久综合狠狠综合久久综合88| 亚洲无毛电影| 国产亚洲美州欧州综合国| 久久综合狠狠| 欧美二区乱c少妇| 在线看日韩欧美| 亚洲你懂的在线视频| 亚洲午夜国产成人av电影男同| 国产精品青草久久久久福利99| 亚洲欧美中文日韩在线| 欧美一区二区三区四区高清| 精品999在线观看| 亚洲国产精品久久久久秋霞不卡| 欧美区亚洲区| 久久国产精品网站| 欧美成人高清| 欧美在线你懂的| 免费亚洲一区| 欧美一区二区三区啪啪| 久久影音先锋| 亚洲视频在线免费观看| 久久精品国产清高在天天线| 一本色道久久综合亚洲精品小说| 亚洲综合视频网| 亚洲精品视频免费在线观看| 亚洲欧美日韩区| 亚洲精品社区| 久久久久久久久久久成人| 亚洲少妇在线| 美日韩免费视频| 久久激情五月丁香伊人| 欧美屁股在线| 欧美成人国产va精品日本一级| 国产精品久久婷婷六月丁香| 欧美国产综合一区二区| 国产一区二区精品丝袜| 99精品国产热久久91蜜凸| 亚洲国产精品999| 午夜精品久久久久久99热软件| 一本色道久久99精品综合| 久久亚洲精选| 久久久精品国产一区二区三区| 欧美极品在线播放| 欧美电影在线| 亚洲高清av在线| 久久不见久久见免费视频1| 亚洲一区二区动漫| 欧美激情综合亚洲一二区| 欧美国内亚洲| 亚洲黄色成人久久久| 久久人人精品| 免费毛片一区二区三区久久久| 韩日精品中文字幕| 亚洲一级一区| 亚洲影院免费观看| 欧美日韩一二三区| 亚洲精选中文字幕| 一本一本久久| 欧美日韩国产综合视频在线观看| 欧美激情第一页xxx| 在线观看国产一区二区| 性欧美暴力猛交另类hd| 欧美一区二区三区免费观看| 欧美视频在线一区二区三区| 日韩视频一区二区在线观看| 久久久无码精品亚洲日韩按摩| 伊人成人在线视频| 久久精品水蜜桃av综合天堂| 久久午夜国产精品| 一区二区三区在线高清| 国产精品成人一区二区艾草| 亚欧成人在线| 国产午夜精品久久久久久久| 香蕉视频成人在线观看 | 国产精品欧美日韩一区| 亚洲素人一区二区| 欧美在线影院在线视频| 韩国自拍一区| 欧美大胆a视频| 亚洲精品偷拍| 午夜国产精品影院在线观看| 国产日韩欧美在线视频观看| 久久久久欧美精品| 亚洲国产日韩欧美| 亚洲午夜精品一区二区三区他趣| 国产精品乱人伦一区二区| 亚洲欧美在线看| 噜噜噜在线观看免费视频日韩| 一色屋精品视频在线看| 欧美大胆成人| 亚洲午夜久久久久久尤物| 久久久亚洲人| 一区二区三区久久网| 国产色综合天天综合网| 老牛影视一区二区三区| 一本不卡影院| 欧美成黄导航| 亚洲一区二区黄色| 好男人免费精品视频| 欧美片网站免费| 久久av免费一区| 亚洲伦理在线观看| 久久久7777| 这里只有精品视频在线| 韩国一区电影| 国产精品成人播放| 看欧美日韩国产| 亚洲视频香蕉人妖| 欧美国产一区在线| 久久久久中文| 国产精品99久久久久久有的能看| 国产一级久久| 国产精品国码视频| 欧美成人一品| 久久久久久有精品国产| 亚洲性av在线| 亚洲电影av| 狂野欧美激情性xxxx欧美| 亚洲欧美视频一区| 亚洲视频一区| 一本色道久久88亚洲综合88| 亚洲激情电影中文字幕| 国产综合欧美|