pthread_joinの使用-


from:https://blog.csdn.net/u012989012/article/details/80800168
 join
Linuxでは、新しいスレッドは元のプロセスではなく、システムが1つのシステムを通じてclone()を呼び出す.このシステムはclone()copyを呼び出し、元のプロセスと全く同じプロセスを呼び出し、このプロセスでスレッド関数を実行します.しかし、このcopyプロセスはforkとは違います.copy後のプロセスは、元のプロセスとすべての変数を共有し、環境を実行します.これにより,元のプロセスにおける変数変動がcopy後のプロセスに現れる.
ではpthread_join関数は何に使いますか???
pthread_joinは、あるスレッドを別のスレッドの終了を待つ.
コードにpthread_がない場合joinプライマリ・スレッドはすぐに終了し、プロセス全体が終了し、作成したスレッドが実行を開始する機会がなく終了します.pthread_を追加join後、メインスレッドは待機しているスレッドが終了するまで待機し、作成したスレッドを実行する機会を与えます.
すべてのスレッドにはスレッド番号、つまりThread IDがあります.そのタイプはpthread_ですt.pthread_を呼び出すself()関数は、独自のスレッド番号を取得できます.
メインスレッド、すなわちmain関数が実行するスレッドが、他のスレッドが終了する前に終了している場合は、バグは推定できません.pthread_経由join関数は、すべてのスレッドが終了するまでメインスレッドをブロックします.
int pthread_join(pthread_t thread, void **value_ptr);
thread:          。
value_ptr:        。

マルチスレッドプログラミングではpthread_をforループで呼び出すことが多いjoin関数、prhtead_を実行する以上joinの後、メインスレッドがブロックされ、後のpthread_を呼び出すこともできません.join、じゃあforサイクルで何の役に立つの?
プライマリ・スレッドは、最初のスレッドで停止します.
たとえば、次のようなものがあります.
pthread_join(1,NULL);
pthread_join(2,NULL);
pthread_join(3,NULL);
pthread_join(4,NULL);
pthread_join(5,NULL);

実はメインスレッドはpthread_join(1,NULL); ここで保留して、1番のスレッドが終わるのを待ってから2番のスレッドを待っています.
もちろん3,4,5対1,2が先に終わる場合があります.メインスレッドはやはり1,2が終わるのを待っていたが,3,4,5は実はとっくに終わっていることに気づき,3,4,5のリソースを回収し,メインスレッドは再び終了する.
detach
pthread_でjoin()関数は、プライマリ・スレッドのブロックを他のスレッドが終了するのを待つようにします.これにより、プライマリ・スレッドは他のスレッドの環境をクリーンアップできます.しかし、一部のスレッドは、自分で終了した状態を整理するのが好きで、メインスレッドがpthreadを呼び出すのも嫌です.joinが彼らを待っています.このようなスレッドの属性をdetached(分離)と呼ぶ.pthread_を呼び出すとcreate()関数の場合、プロパティをNULLに設定すると、作成したスレッドにデフォルトのプロパティ、すなわちjionable(detachedではない)を使用したいことを示します.
プロパティをdetachedに設定する必要がある場合.次のように設定します.
pthread_attr_t  attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,  PTHREAD_CREATE_DETACHED);
pthread_create(&pthreadid,  &attr,  myprocess,  &arg);

警告:
スレッドがjoinableに設定されている場合、pthread_を呼び出すことができます.detach()をdetachedにします.しかし、反対の操作はできません.また、スレッドがpthread_を呼び出した場合join()後、pthread_を呼び出すdetach()は何の効果もありません.スレッドは、自身の実行によって終了してもよいし、pthread_を呼び出すことによって終了してもよい.exit()は、スレッドの実行を終了します.また、スレッドAは、スレッドBによって受動的に終了することができる.これはpthread_を呼び出すことによって目的を達成するためにcancel()を使用します.
int pthread_cancel(pthread_t thread);

関数呼び出しは正常に0を返しました.もちろん、スレッドも受動的に他の人に終わるわけではありません.独自のプロパティを設定することで、終了方法を決定できます.
スレッドのパッシブエンドは,非同期エンドと同期エンドの2つに分けられる.
非同期終了は、他のスレッドがpthread_を呼び出すときです.cancelの時、スレッドはすぐに終わります.
同期終了はすぐに終了することはなく、次の終了ポイントに到達するまで実行されます.スレッドがデフォルトの作成方法で作成されると、そのプロパティは同期終了です.