pthread_joinを機能
スレッドを待って終了し、スレッドがその役割の終了ステータス、対応するプロセスのwaitpid()関数を取得します。
int型pthread_joinを(がpthread_tスレッド、RETVAL無効**);成功:0;失敗しました:いいえ。
パラメータ:スレッド:スレッドID([注]:いないポインタ); RETVAL:糸端状態を記憶します。
メモリーコントラスト:
プロセス:メインの戻り値、終了パラメータ - > int型は、子供を待つ待機関数パラメータを終了 - > int型*
スレッド:メイン関数の戻り値は、pthread_exitスレッド - > void *型を、待機中のスレッドがpthread_joinを関数のパラメータを終了 - >無効**
[実践]:非ヌルパラメータRETVAL使用。[Pthrd_exit_join.c]
この関数はスレッドIDスレッドとして終了されるまで、スレッドのハングを待つと呼ばれています。状態を終了することによって、異なる方法で終了スレッドスレッドは、次のようにまとめ、得られた異なるpthread_joinをです。
- スレッド戻り戻りRETVAL部を介して、スレッドは戻り値で指されたスレッドのスレッド関数に格納されています。
- スレッドがスレッドのpthread_cancel呼び出された場合、別のスレッドが出て異常終了し、RETVALユニットは、店舗に指している一定PTHREAD_CANCELEDあります。
- スレッドは、スレッドの場合は終了pthread_exit自分自身を呼び出して、RETVAL尖ったユニットがpthread_exitに渡されたパラメータに格納されます。
- あなたがスレッドを終了するスレッドの状態に興味がない場合は、RETVALパラメータにNULLを渡すことができます。
[実践]:回復機能pthread_joinの複数の子スレッドを使用してサイクルが作成されます。
/ * ** thread_join.c ** * / 書式#include <stdio.hに> する#include <error.h> 書式#include < 文字列の.h> 書式#include <unistd.h> 書式#include <stdlib.h>に含ま する#include <pthreadの.H> のtypedef 構造体 { チャーCH。 int型 VAR 。 チャー STR [ 64 ]。 } exit_t。 ボイド * thrd_func(ボイド * 引数) { pthread_exit((ボイド *)1 )。 } int型メイン() { がpthread_tのTID。 int型のRET; int型 * RETVAL。 printf(" メイン1:スレッドID =%のLU、PID =%U \ n " 、pthread_self()、GETPID())。 RET =のpthread_create(&TID、NULL、thrd_func、NULL); もし(0!= RET) { 関数fprintf(stderrに、" pthread_createのエラー:%Sの\ n " 、にstrerror(RET))。 出口(1 )。 } pthread_joinを(TID、(ボイド **)&RETVAL)。 printf("--------------%D \ n "、(INT )RETVAL); pthread_exit((ボイド *)1 ); }
結果:
ubuntu1604 @ Ubuntuの:〜/ wangqinghe / linuxの/ 20190819 $ ./thread_join
メイン1:スレッドID = 139721544345344、PID = 12974
-------------- 1
/ * ** pthread_join_struct.c ** * / 書式#include <stdio.hに> する#include <error.h> 書式#include < 文字列の.h> 書式#include <unistd.h> 書式#include <stdlib.h>に含ま する#include <pthreadの.H> のtypedef 構造体 { チャーCH。 int型 VAR 。 チャー STR [ 64 ]。 } exit_t。 ボイド * thrd_func(ボイド * 引数) { exit_t * retvar =(exit_t *)のmalloc(はsizeof(exit_t))。 retvar - > CH = ' M ' 。 retvar - > VAR = 200 ; strcpyの(retvar - > STR、" 私のスレッド\ nを" ); pthread_exit((exit_t * )retvar)。 } int型のmain() { がpthread_tのTID。 int型のRET; exit_t * RETVAL。 printf(" メイン1:スレッドID =%のLU、PID =%U \ n " 、pthread_self()、GETPID())。 RET =のpthread_create(&TID、NULL、thrd_func、NULL); もし(0!= RET) { 関数fprintf(stderrに、" pthread_createのエラー:%Sの\ n " 、にstrerror(RET))。 出口(1 )。 } pthread_joinを(TID、(ボイド **)&RETVAL)。 printf(" CH =%C、VAR =%dの、STR =%S \ nは--------------%D \ n "、retval-> CH、retval-> VAR、RETVAL - > 文字列); 無料(RETVAL)。 pthread_exit((ボイド *)1 )。 }
結果:
ubuntu1604 @ Ubuntuの:〜/ wangqinghe / linuxの/ 20190819 $ ./thread_join
メイン1:スレッドID = 140316487100160、PID = 13121
CH =メートル、VAR = 200、STR =私のスレッド
-------------- 202
/ * ** thread_join_loop.c ** * / 書式#include <stdio.hに> する#include < 文字列の.h> 書式#include <unistd.h> の#include <pthread.hの> int型VAR = 100 ; 無効 * TFN(ボイド *の引数) { int型私は、 I =(int型)引数。 スリープ(I); もし(1 == I) { VAR = 333 。 printf(" VAR =%d個の\ nを"、 VAR ); リターン(ボイド *)VAR 。 } そう であれば(3 == I) { VAR = 888 。 printf(" 私は%DTHのpthread、pthreadのID =%のLU、VAR =%Dを\ n "、I + 1、pthread_self()、VAR )。 pthread_exit((ボイド *)VAR )。 } 他 { のprintf(" iは%DTHのpthread、pthreadのID =%のLU、VAR =%d個の\ nだ"、I + 1、pthread_self()、VAR )。 pthread_exit((ボイド *)VAR )。 } 戻りNULL。 } int型のmain() { がpthread_tのTID [ 5 ]。 int型私は、 int型 * RET [ 5 ]。 用(i = 0 ; iは< 5 ; iは++ ) { のpthread_create(&TID [i]は、NULL、TFN、(ボイド * )I); } のための(i = 0 ; iは< 5 ; iは++ ) { pthread_joinを(TID [i]は、(無効 **)&RET [I]); printf(" -----------%DのRET =%d個の\ n "、(INT )RET [I])。 } のprintf(" 私はメインのpthreadのTID =%のLU VAR =%d個の\ nだ"、pthread_self()、VAR )。 スリープ(I); リターン 0 ; }
結果:
ubuntu1604 @ Ubuntuの:〜/ wangqinghe / linuxの/ 20190819 $ ./thread_loop
私は1番目のpthread、pthreadのID = 139809124009728、VARだ= 100
----------- 100の右= -645238160
= 333でした
----------- 333の右= -651408960
私は第3回のpthread、pthreadのID = 139809107224320、VARだ= 333
----------- 333の右= -659801664
私は第四のpthread、pthreadのID = 139809098831616、VARだ= 888
----------- 888 K = -668194368
私は第五のpthread、pthreadのID = 139809090438912、VARだ= 888
----------- 888 K = 0
私は、メインのpthreadだTID = 139809132349184 VAR = 888