2. スレッドの作成と終了
pthread_createの:(1)関数を作成します
ヘッダ |
書式#include <pthread.hの> |
機能 |
int型のpthread_create(がpthread_t * tidp、CONSTのpthread_attr_t * attrの、 void *型(* start_rtn)(void *型)、void *型のarg); |
返却値 |
成功したリターン0、それ以外の場合はエラー番号を返します。 |
パラメータ |
(1)tidp:スレッド識別子ポインタ (2)ATTR:スレッドポインタプロパティ 関数を実行するスレッドの開始アドレス:(3)start_rtn (4)引数:引数のスレッド実行中の関数に渡さ |
リマーク |
(1)新たに作成されたスレッドは、アドレスstart_rtn機能で実行を開始します (2)は、呼び出し元のスレッドの実行と、新しいスレッドの順序を保証するものではありません。 |
【プログラミング】実験カメおよびノウサギ
//pthread_race.c
書式#include <pthread.hの> 書式#include <stdio.hに> する#include <stdlib.h>に含ま する#include <TIME.H> //例:ウサギとカメ //コンパイルオプション:gccの-oビン/ pthread_raceのsrc / pthread_race。 -lpthread C //スレッド関数パラメータの型を定義 構造体のtypedef { 文字名[20である];スレッドの//名前 INT時間; //スリープ時間 INT開始; //ポイント開始 INT端部を; //端 } RaceArg; //カスタム・スレッド実行機能 無効* th_fn(void *型のArg) { RaceArg = RA *(* RaceArg)のArg; int型I = RA->スタート; 用(; I <= RA-> END; I ++){ のprintf(「%S(% LX)%D RUN \ N-」、RA->名前、pthread_self()に、I); はusleep(RA->時間); //時間のマイクロ秒 } リターン(void *型)(RA->エンド- RA->スタート); // 戻りは逃げた。 //また、pthread_exitを呼び出すことができます((void *型)(RA末端- RA-スタート)); スレッドを終了します } メインINT(ボイド) { srand48(時間(NULL)); //シードランダム、擬似ランダム生成器は、初期化drand48ある INT ERR = 0; がpthread_tウサギ、カメ; //はウサギを定義し、亀のスレッドが //に渡されますスレッド関数パラメータ(0-1間の二重乱数間drand48戻り値) RaceArg R_A = { "うさぎ"、(INT)(drand48(* 10)* 10 * 1000)、20は、50}。 RaceArg T_A = { "タートル"、(INT)(drand48()* 1000 10 * 10)、10、60}; //ウサギスレッド(ウサギ)を作成し (ERR =のpthread_create(&ウサギ場合、NULL、th_fn、(ボイド!*)&R_A)= 0){ perrorは( "pthread_createのエラー"); } //スレッドカメ(亀)を作成 もし(ERR =のpthread_create(&カメ、NULL、th_fn、(void *型)&T_A)!= 0){ perrorは( "pthread_createのエラー"); } //等待ウサギ线程结束 int型* RET = NULL; pthread_joinを(ウサギ、(無効**)&RET)。// pthread_joinを(ウサギ、NULL);不关心子线程返回值 のprintf( "ウサギの距離が%D \ n"は、(int型)RET)。 //等待亀线程结束 pthread_joinを(カメ、(無効**)&RET)。 printf(、(int型)RET "亀の距離は、%D \ nが"); // pthread_joinを(亀、NULL); printf( "メインスレッドID:%LX \ n"は、pthread_self())。 printf( "メインスレッド完成\ nは!"); 0を返します。 }
(2)スレッドの終了
①アクティブ終端:実行スレッドの関数呼び出しのreturn文またはpthread_exit()
②受動終了:スレッドが同じプロセス内の他のスレッド(呼のpthread_cancel(pthid))によってキャンセルすることができます。
③関連する関数の終了
ヘッダ |
書式#include <pthread.hの> |
機能 |
pthread_cancel INT(TIDがpthread_t); //スレッドのTIDを終了し、TIDパッシブ終了 pthread_exitはint(void *型のretval); //は、主導権を終了 pthread_joinをint型(THがpthread_t、無効** thread_return);スレッドの終了を待つ// |
返却値 |
成功したリターン0、それ以外の場合はエラー番号を返します。 |
パラメータ |
(1)は、TID:スレッド識別子を終了します (2)RETVAL:pthread_exit呼び出し側スレッドの戻り値、及び他の機能はpthread_joinをGETを検出するために使用することができます。 (3)目:子スレッド識別子pthread_joinを待ち。 (4)thread_return:待機中のスレッドの値を格納するためのカスタムポインタが返されます。 |
リマーク |
(1)のpthread_cancel:スレッドは、同じプロセス内の他のプロセスによってキャンセルすることができます。 (2)プロセスの複数のスレッドを共有データセグメントので、それがリソースを終了し、スレッドが終了した後、多くの場合、あるスレッドによって占められ、スレッドは、あなたがスレッドの終了を待つpthread_joinを関数を呼び出す必要があるので、リリースと同様のには終了しませんシステムコールを待ちます。 |
プログラミング終了実験[スレッド]
//pthread_term.c
#include <pthread.hの> する#include <stdio.hに> する#include <STDLIB.H> / * /戻り値終了するスレッドを取得 //パラメータは関数スレッド定義 構造体のtypedef { DATAL INT、 INT DATA2; }のArgを、 //スレッド関数定義 ボイド* th_fn(ボイド*のArg) { ; ArgのRET * =(Argを*)のArg //リターン(ボイド*)(R-> DATAL + R-> DATA2)と、 リターンRET; } (INTメイン) { int型ERR = 0; がpthread_t TH; ArgでR&LT = {20は、50}; //新しいスレッドを作成する !IF((ERR =のpthread_create(&TH、NULL、th_fn、(ボイド*)&R&LT))= 0){ にperror ( "pthread_createのエラー"); } / * 取得サブスレッドの//戻り値 int型*結果= NULL; //子スレッドの戻り値は、着信pthread_joinをvoid *型であるため 、//自体がないではNULLで、結果のサブスレッドのリターンの値に変更されます。 //これは、結果自体の値を変更する、2つの入力ポインタの目的です。 pthread_joinを(TH、(無効**)&結果); のprintf( "%Dの結果が\ N-"、(int型)の結果); * / サブスレッドの//戻り値が取得 のArgを*結果= NULL; pthread_joinを(TH、( *ボイド)&結果); のprintf( "%Dの結果が\ N-"、result-> result- DATAL +> DATA2)を、 戻り0; }