【Linux】スレッド制御!

4569 ワード

Linuxではスレッドを軽量レベルスレッドと呼びますが、スレッドの終了には以下の方法があります.
  • スレッドはreturn関数を呼び出して返しますが、メインスレッドでreturn関数を呼び出すのはメインスレッドでexit関数を呼び出すのと同じです.
  • スレッド呼び出しpthread_exit関数終了
  • スレッド呼び出しpthread_cancel関数は、同じプロセス内の他のスレッド
  • を終了します.
    システムの観点からスレッドを見るには具体的な構造はなく,システムの目にはプロセスしかない.したがって,スレッドはプロセスと同様に,実行時に一定の前後順序がなく,具体的にはシステムのスケジューリング方式と関係がある.したがって、プロセスの作成後にスレッドを制御する必要があります.
    スレッド待ちint pthread_join(pthread_t thread,void** value_ptr); thread:スレッドID value_ptr:ポインタを指し、ポインタがスレッドの戻り値を指してpthread_を呼び出すjoin関数の場合、呼び出されたスレッドは、指定したスレッドが終了するまで待機し、そのスレッドの終了状態を取得し、スレッドのリソースを回収します(プロセス待機と同様).同様に、スレッドが終了するまで待機していない場合、そのスレッドはゾンビプロセスに似た状態になり、メモリが漏洩します.スレッドを作成するときは、作成した各スレッドをメインスレッドで待つ必要があります.これにより、メモリの漏洩の問題を回避できます.
    スレッド終了int pthread_exit(void** value_ptr); value_ptr:スレッド終了時の終了コード注意:value_ptrは、スレッドでpthread_を呼び出すため、グローバル変数またはmalloc関数を使用して申請する空間を指す必要があります.exit関数のときにスレッドが終了し、スタックリソースが解放されます.int pthread_cancel(pthread_t thread); thread:スレッドIDはpthread_を呼び出すcancel関数は、同じプロセス内の任意のスレッド(キャンセルするスレッド自体を含む)でpthread_を使用できます.cancel関数の場合のスレッドの終了コードはPTHREAD_CANCELED—->((void**)-1);
    スレッド分離デフォルトで作成されたスレッドは結合可能であり、スレッドが終了した後にpthread_を使用する必要があります.joinは、スレッドを終了するリソースを回収します.スレッドの終了ステータスに関係しない場合はpthread_を呼び出します.join操作は負担であり,このときスレッドを分離することができ,スレッドが終了すると自動的にリソースを解放する.int pthread_detach(pthrad_t thread); thread:スレッドIDは、同じプロセス内のスレッドをターゲットスレッドから分離してもよいし、スレッド自体を分離してもよい.スレッドが分離された後、スレッドは他のスレッドによって回収および終了されず、分離スレッドのリソースはシステムによって自動的に解放される.
    注意:スレッドの結合と分離は反発的であり、1つのスレッドは結合可能な有事分離ではありません.
    例:
    #include
    #include
    #include
    #include
    #include
    
    void* ret1;
    void* ret2;
    void* ret3;
    void* pthread_run1(void*arg){
        sleep(1);
        printf("I`m first pthread
    "
    ); int* p = malloc(sizeof(int)); *p = 1; pthread_exit((void*)p); } void* pthread_run2(void* arg){ sleep(1); printf("I`m second pthread
    "
    ); int* p = malloc(sizeof(int)); *p = 2; pthread_exit((void*)p); } void* pthread_run3(void* arg){ sleep(1); printf("I`m three pthread
    "
    ); int* p = malloc(sizeof(int)); *p = 3; pthread_exit((void*)p); } int main(){ pthread_t tid1,tid2,tid3; pthread_create(&tid1,NULL,pthread_run1,NULL); pthread_create(&tid2,NULL,pthread_run2,NULL); pthread_create(&tid3,NULL,pthread_run3,NULL); pthread_join(tid1,&ret1); pthread_join(tid2,&ret2); pthread_join(tid3,&ret3); printf("pthrad1 exit code :%d
    "
    ,*(int*)ret1); printf("pthrad1 exit code :%d
    "
    ,*(int*)ret2); printf("pthrad1 exit code :%d
    "
    ,*(int*)ret3); return 0; }