pthread_joinを()関数のプロトタイプ:
int pthread_join(pthread_t thread, void **retval);
args:
pthread_t thread: 被连接线程的线程号
void **retval : 指向一个指向被连接线程的返回码的指针的指针
return:
线程连接的状态,0是成功,非0是失败
1.なぜ使用pthread_joinを()
多くの場合、メインスレッドが作成し、子スレッドを起動し、時間のかかる操作の多くの子スレッドは、多くの場合、子供の前にメインスレッドが終了するスレッド場合は、しかし、メインスレッドは、他の事項との契約が終了した場合、必要がしますサブスレッドの実行の終了が完了した後に長く待つようにメインスレッドのニーズであるサブスレッドの結果に対処するために、我々はpthread_joinを()メソッドを使用する必要があり、この時間があります。
そのアクションでpthread_join()が理解されることがあります。メインスレッドの待機ターミネータースレッドを。すなわち、サブスレッドはpthread_joinを()メソッドコードの背後を呼び出し、唯一のサブスレッドが終了するまで実行することができます。
スレッドは、スレッドBとpthread_joinを()を呼び出すと、スレッドがスレッドBが終了するまでブロックされ、スレッドは実行を継続します。pthread_joinを()関数の戻りは、呼び出しスレッドが真の意味で終わりであると考えられる場合、そのメモリ空間が解放される(呼び出しスレッドがある場合に非絶縁)。ここで注目すべき3つのものがあります:
-
解放されたメモリ空間は、手動などのmalloc()スペース割り振りとして、プログラムに割り当てられたスペースをクリアする必要があり、唯一の宇宙システムです。
2. Aスレッドは、スレッドに接続することができます。
3.スレッドは接続が非絶縁でなければならない、または接続が間違っていることでしょう。
それは)pthread_joinを(見ることができる2つの効果があります。 -
糸のもう一方の端を待っている:あなたは()でpthread_joinを呼び出すと、現在のスレッドは、スレッドの終了が呼び出された後までブロックされ、現在のスレッドが実行を再開します。
-
リサイクルのためのスレッドリソース:スレッドは非絶縁です(デフォルトで作成されたスレッドは、非絶縁されている)と(スレッドpthread_joinの使用していない場合)は、スレッドの終了後につながることができ、そのメモリ空間を、解放されません。このスレッドは、「ゾンビスレッド。」となっています
2.使用
TIDがpthread_t;
のpthread_create(&TID、NULL、thread_run、NULL);
pthread_joinを(TID、NULL);
行にスレッドを作成した後、直接pthread_joinをメソッドを呼び出します。
3.実験コード
あなたは、私たちが知っている、コードが実行する効果を見ることができます:
#include "stdafx.h"
#include <pthread.h>
#include <stdio.h>
#include <Windows.h>
#pragma comment(lib, "pthreadVC2.lib")
static int count = 0;
void* thread_run(void* parm)
{
for (int i=0;i<5;i++)
{
count++;
printf("The thread_run method count is = %d\n",count);
Sleep(1000);
}
return NULL;
}
int main()
{
pthread_t tid;
pthread_create(&tid, NULL, thread_run,NULL);
// 加入pthread_join后,主线程"main"会一直等待直到tid这个线程执行完毕自己才结束
// 一般项目中需要子线程计算后的值就需要加join方法
pthread_join(tid,NULL);
// 如果没有join方法可以看看打印的顺序
printf("The count is = %d\n",count);
getchar();
return 0;
}
プラスpthread_joinを()メソッドを印刷します:
コメント印刷pthread_joinを()メソッドの内部であれば:
直接左から、実行は増加のpthread_joinを()メソッドは、メインスレッドが存在しない場合は、それを見ることができ、唯一のコードの実行後にスレッドが実行を待った後、再び追加されます。