1. スレッドの概念
スレッドはプロセス内の基本的な実行フローであり、システム スケジューリングのエンティティです。プロセスは排他的であり、スレッドは共有されます。各スレッドは、プロセスのファイル記述子、信号処理メソッド、現在の作業ディレクトリ、ユーザー ID (uid)、およびグループ ID (gid) を共有します。ただし、スレッド ID、スタック スペース、コンテキスト (さまざまなレジスタの値、プログラム カウンタ、スタック ポインタを含む)、スペース、シグナル マスク ワード、スケジューリング優先度など、一部のリソースはスレッドにプライベートです。プロセスが家族であるのと同じように、スレッドも家族のメンバーです。各家族には共有スペース (ダイニング ルーム、リビング ルーム) があります。もちろん、家族それぞれにも自分のプライベートスペースがあります。
2. スレッド制御
スレッドの作成と終了
関数 pthread_create() で作成し、成功した場合は 0 を返し、失敗した場合はエラー番号を返します。 pthread_create() を呼び出して新しいスレッドを作成した後。現在のスレッドは pthread_create() から戻り、実行を継続します。新しいスレッドによって実行されるコードは、関数ポインタ start_routine によって決定されます。 start_routine 関数は、pthread_create() の引数を通じて渡されるパラメーターを受け取ります。型は void* であり、start_toutine の戻り値の型も void* です。 start_toutine が戻った後、このスレッドは終了し、他のスレッドは pthread_join() を呼び出して start_toutine の戻り値を取得できます。 start_toutine関数は、①return(void*)、②pthread_exit(void*)、③pthread_cancel(pthread_self())で終了できます。
#include<stdio.h> 2 #include<pthread.h> 3 void * thread_run(void* arg) 4 { 5 int count=5; 6 while(1) 7 { 8 printf("this is a thread,thread id is\n"pthread_self()); 9 sleep(1); 10 } 11 //return (void*)1; 12 //pthread_exit((void*)2); 13 // pthread_cancel(pthread_self()); 14 } 15 int main() 16 { 17 pthread_t id; 18 int ret=pthread_create(&id,NULL,thread_run,NULL); 19 int count=10; 20 while(count-->0) 21 { 22 printf("this is a main thread,thread id is %u\n",pthread_self()); 23 sleep(1); 24 } 25 void * ted=0; 26 pthread_cancel(id); 27 pthread_join(id,&ted); 28 printf("return success %d\n",(int)ted); 29 }
次のことがわかります:
1. 返品により返品された場合。 pthread_joinで受け取る値はスレッド
2の戻り値です。 他のスレッドがpthread_cancelを呼び出して異常終了した場合。エラーコードが返されます
3. pthread_exitを呼び出して終了した場合。 pthread_join は、pthread_exit に渡されるパラメータを保存します。
4. 2 つのスレッドのスレッド番号が異なります
3. スレッドの分離
任意の時点で。結合または分離可能です。関連付け可能なスレッドは、他のスレッドによって回収および強制終了できます。そのメモリ リソースは、他のスレッドによってリサイクルされる前に解放されません。切り離し可能なスレッドは、他のスレッドによってリサイクルしたり強制終了したりすることはできず、そのメモリ リソースは終了時にシステムによって自動的に解放されます。デフォルトでは。スレッドは関連付けられるように作成されます。メモリ リークを回避するには、参加可能な各スレッドを pthread_join を呼び出して明示的に再利用するか、pthread_detach 関数を介して切り離す必要があります。
参加可能なスレッドが終了しても pthread_join されていない場合、そのステータスはプロセス内のゾンビ プロセスに似ています。つまり、一部のリソースがリサイクルされていないため、スレッド作成者は pthread_join を呼び出してスレッドの実行が終了するのを待つ必要があります。スレッドの終了コードを取得し、そのリソースを再利用できます。 pthread_join を呼び出した後、スレッドが終了しない場合、呼び出し元はブロックされます。これを行うには、コード pthread_detach(pthread_self()) を子スレッドに追加するか、pthread_detach(thread_id) を呼び出す親スレッドを非ブロックにしてすぐに返すようにします。これにより、子スレッドの状態がデタッチに設定され、スレッドの実行が終了するとすべてのリソースが自動的に解放されます。
1 #include<stdio.h> 2 #include<pthread.h> 3 void* thread_run(void* arg) 4 { 5 pthread_detach(pthread_self()); //分离线程 6 printf("this is a thrad \n"); 7 return (void*)1; 8 } 9 int main() 10 { 11 pthread_t id; 12 int ret= pthread_create(&id,NULL,thread_run,NULL); 13 printf("this is a main thread\n"); 14 sleep(1); 15 16 int res=pthread_join(id,NULL); 17 if(res==0) 18 { 19 printf("pthrad wait succced\n"); 20 return 0; 21 } 22 else 23 { 24 printf("pthread wait faile\n"); 25 return 1; 26 } 27 return 0; 28 }
子スレッドで pthread_detach(pthread_self()) をコメントアウトすると、結果は次のようになります。これは、子スレッドをデタッチした後、他のスレッドが子スレッドのプロセスに参加して強制終了する可能性があるためです。メモリ リソースを解放します。上記は子プロセス内で切り離されているため、他のスレッドからアクセスできなくなっているためです
概要:
スレッドの制御は作成スレッドから始まります-> の3つの終了方法です。子スレッド --> 他のスレッドがスレッドに参加します。終了方法によってjoinの戻り値が異なります。スレッド分離の場合、サブスレッドに pthread_detach() を追加すると、スレッド終了後にサブスレッドが切り離し可能なスレッドとして設定され、メモリリークを発生させることなく自動的にメモリリソースが解放されます。設定されていない場合は、join を使用して受信を表示し、リソースを解放する必要があります。これにより、メモリ リークは発生しません。
上記は Linux のスレッド制御と分離の内容です。さらに関連する内容については、PHP 中国語 Web サイト (m.sbmmt.com) を参照してください。