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

posts - 297,  comments - 15,  trackbacks - 0

pthread_join函數及linux線程

pthread_join使一個線程等待另一個線程結束。

 

代碼中如果沒有pthread_join主線程會很快結束從而使整個進程結束,從而使創建的線程沒有機會開始執行就結束了。加入pthread_join后,主線程會一直等待直到等待的線程結束自己才結束,使創建的線程有機會執行。

 

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

 

下面說一下如何創建一個線程。

 

通過創建線程,線程將會執行一個線程函數,該線程格式必須按照下面來聲明:

 

       void * Thread_Function(void *)

 

創建線程的函數如下:

 

       int pthread_create(pthread_t *restrict thread,

 

              const pthread_attr_t *restrict attr,

 

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

 

下面說明一下各個參數的含義:

 

thread:所創建的線程號。

 

attr:所創建的線程屬性,這個將在后面詳細說明。

 

start_routine:即將運行的線程函數。

 

art:傳遞給線程函數的參數。

 

下面是一個簡單的創建線程例子:

 

#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;

 

}

 

 

在編譯的時候需要注意,由于線程創建函數在libpthread.so庫中,所以在編譯命令中需要將該庫導入。命令如下:

 

gcc –o createthread –lpthread createthread.c

 

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

 

下面一個問題和前面創建進程類似,不過帶來的問題回避進程要嚴重得多。如果你的主線程,也就是main函數執行的那個線程,在你其他縣城推出之前就已經退出,那么帶來的bug則不可估量。通過pthread_join函數會讓主線程阻塞,直到所有線程都已經退出。

 

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

 

thread:等待退出線程的線程號。

 

value_ptr:退出線程的返回值。

 

下面一個例子結合上面的內容:

 

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()函數來使主線程阻塞等待其他線程退 出,這樣主線程可以清理其他線程的環境。但是還有一些線程,更喜歡自己來清理退出的狀態,他們也不愿意主線程調用pthread_join來等待他們。我 們將這一類線程的屬性稱為detached。如果我們在調用pthread_create()函數的時候將屬性設置為NULL,則表明我們希望所創建的線 程采用默認的屬性,也就是jionable。如果需要將屬性設置為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);

 

}

 

 

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

 

線程可以通過自身執行結束來結束,也可以通過調用pthread_exit()來結束線程的執行。另外,線程甲可以被線程乙被動結束。這個通過調用pthread_cancel()來達到目的。

 

int pthread_cancel(pthread_t thread);

 

       函數調用成功返回0

 

當然,線程也不是被動的被別人結束。它可以通過設置自身的屬性來決定如何結束。

 

線程的被動結束分為兩種,一種是異步終結,另外一種是同步終結。異步終結就是當其他線程調用 pthread_cancel的時候,線程就立刻被結束。而同步終結則不會立刻終結,它會繼續運行,直到到達下一個結束點(cancellation point)。當一個線程被按照默認的創建方式創建,那么它的屬性是同步終結。

 

通過調用pthread_setcanceltype()來設置終結狀態。

 

int pthread_setcanceltype(int type, int *oldtype);

 

state:要設置的狀態,可以為PTHREAD_CANCEL_DEFERRED或者為PTHREAD_CANCEL_ASYNCHRONOUS

 

那么前面提到的結束點又是如何設置了?最常用的創建終結點就是調用pthread_testcancel()的地方。該函數除了檢查同步終結時的狀態,其他什么也不做。

 

上面一個函數是用來設置終結狀態的。還可以通過下面的函數來設置終結類型,即該線程可不可以被終結:

 

int pthread_setcancelstate(int state, int *oldstate);

 

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

 

最后說一下線程的本質。其實在Linux中,新建的線程并不是在原先的進程中,而是系統通過 一個系統調用clone()。該系統copy了一個和原先進程完全一樣的進程,并在這個進程中執行線程函數。不過這個copy過程和fork不一樣。 copy后的進程和原先的進程共享了所有的變量,運行環境。這樣,原先進程中的變量變動在copy后的進程中便能體現出來。


from:

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

posted on 2010-08-24 18:01 chatler 閱讀(2653) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

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

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美激情视频在线观看一区二区三区 | 美脚丝袜一区二区三区在线观看 | 国产精品毛片a∨一区二区三区|国| 欧美一区二区三区久久精品茉莉花 | 久久婷婷麻豆| 国产精品成人一区| 亚洲精品资源| 亚洲国产综合在线看不卡| 香蕉久久夜色精品国产使用方法 | 亚洲免费视频成人| 欧美激情在线狂野欧美精品| 久久午夜视频| 国产主播精品在线| 亚洲欧美日韩国产综合在线| 亚洲网站视频| 欧美日韩国产在线看| 欧美激情成人在线| 91久久精品国产91久久| 欧美中文在线观看国产| 性做久久久久久久久| 国产精品国产a| 这里只有精品电影| 亚洲综合色自拍一区| 欧美亚洲成人免费| 在线亚洲美日韩| 亚洲欧美日韩高清| 国产精品久久久久久模特| 一级日韩一区在线观看| 亚洲午夜精品久久| 国产精品女人毛片| 亚洲欧美99| 久久精品最新地址| 国产日韩一区二区三区| 欧美一区二区三区免费在线看 | 久久精彩视频| 久久综合色综合88| 亚洲国产日韩综合一区| 免费一级欧美在线大片| 亚洲狠狠婷婷| 99国产精品视频免费观看一公开| 欧美精品免费视频| 一区二区三区高清在线| 亚洲欧美日韩精品久久奇米色影视| 国产精品va在线播放我和闺蜜| 在线视频欧美日韩精品| 久久精品国产在热久久 | 亚洲激情欧美激情| 亚洲一区二区三区中文字幕在线| 国产精品久久久久久久第一福利| 午夜国产精品视频| 欧美电影专区| 亚洲一区二区视频在线| 国产婷婷精品| 久久久亚洲国产天美传媒修理工| 亚洲日本中文字幕免费在线不卡| 亚洲欧美国产精品va在线观看| 国产视频亚洲精品| 欧美成人精品高清在线播放| 亚洲最新视频在线| 免费看av成人| 亚洲在线免费观看| 影音先锋久久精品| 欧美性大战久久久久| 久久婷婷蜜乳一本欲蜜臀| 亚洲日韩中文字幕在线播放| 欧美亚洲在线| 日韩写真视频在线观看| 国产欧美一区二区精品性| 欧美成人一品| 久久精品30| 中国成人黄色视屏| 免费日韩av片| 先锋影音网一区二区| 1024成人网色www| 国产精品美女| 欧美日韩精品免费在线观看视频| 欧美中文字幕第一页| 一区二区国产精品| 91久久夜色精品国产九色| 久久国产天堂福利天堂| 亚洲婷婷综合色高清在线| 亚洲第一视频网站| 国产真实乱子伦精品视频| 国产精品久久久久影院色老大| 欧美成人首页| 久久久久亚洲综合| 翔田千里一区二区| 亚洲图中文字幕| 亚洲另类黄色| 亚洲人成久久| 亚洲欧洲综合另类| 欧美国产一区二区| 牛人盗摄一区二区三区视频| 久久久综合精品| 欧美一区二区三区久久精品茉莉花| 一区二区三区四区五区精品| 亚洲精品久久久久久久久久久久| 亚洲成人在线| 在线观看欧美亚洲| 极品尤物久久久av免费看| 国产欧美一区二区三区另类精品| 欧美午夜在线视频| 国产精品毛片va一区二区三区| 欧美乱人伦中文字幕在线| 欧美精品九九99久久| 欧美成人精品高清在线播放| 欧美va天堂va视频va在线| 久久婷婷影院| 欧美成年人视频| 欧美大片网址| 欧美日韩国产免费观看| 欧美日韩中国免费专区在线看| 欧美华人在线视频| 欧美日韩高清区| 欧美午夜电影在线观看| 国产精品久久久久77777| 欧美无砖砖区免费| 国产精品亚洲精品| 国产亚洲一区二区三区在线观看| 国产一区在线看| 在线观看日韩精品| 亚洲日本va午夜在线影院| 99在线精品视频在线观看| 亚洲视频在线观看视频| 亚洲欧美成人网| 久久久久久亚洲综合影院红桃| 老妇喷水一区二区三区| 亚洲国产99| 亚洲愉拍自拍另类高清精品| 欧美亚洲视频在线看网址| 久久一二三区| 欧美午夜视频在线观看| 国产一区二区三区在线观看视频 | 亚洲一区自拍| 久久久久久久综合| 欧美国产乱视频| 亚洲美女中出| 久久国产精品一区二区| 久热精品视频在线观看| 欧美视频福利| 尤物yw午夜国产精品视频明星| 亚洲免费电影在线观看| 午夜一区二区三区在线观看| 老司机aⅴ在线精品导航| 91久久国产综合久久蜜月精品 | 国产真实久久| 一本到高清视频免费精品| 欧美一级大片在线免费观看| 欧美超级免费视 在线| 一区二区三区国产精华| 久久久久9999亚洲精品| 欧美日韩国产色视频| 激情欧美日韩一区| 在线视频亚洲欧美| 老牛国产精品一区的观看方式| 亚洲精品免费电影| 久久久91精品国产| 国产精品福利网| 亚洲精品一区二区在线观看| 久久国产精品第一页 | 欧美电影资源| 午夜精品久久久久久久男人的天堂 | 欧美在线播放视频| 欧美视频国产精品| 亚洲日本视频| 久久欧美肥婆一二区| 亚洲性视频网站| 欧美精品xxxxbbbb| 亚洲国产成人av| 久久人人爽人人爽| 亚洲欧美国产不卡| 欧美日韩综合| 99精品国产热久久91蜜凸| 欧美成人三级在线| 久久久久久9| 激情久久一区| 久久久精品日韩欧美| 亚洲一区国产| 国产精品毛片大码女人| 亚洲天堂av在线免费| 亚洲片在线观看| 欧美黄色小视频| 亚洲免费观看高清完整版在线观看熊| 久久久久久网址| 欧美一级专区免费大片| 国产精品手机视频| 欧美一区视频在线| 亚洲欧美日韩成人| 国产日韩欧美| 久久久成人精品| 久久精品成人一区二区三区蜜臀 | 欧美福利在线观看| 老色鬼精品视频在线观看播放| 国产偷久久久精品专区| 久久国内精品自在自线400部| 亚洲一区二区三区中文字幕在线| 国产精品av一区二区| 午夜精品亚洲一区二区三区嫩草| 中文一区二区在线观看| 国产精品性做久久久久久|