91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

線程的控制與分離

發布時間:2020-07-28 22:12:01 來源:網絡 閱讀:306 作者:小楊楊雪松 欄目:編程語言

線程的控制

  1. 線程的創建:

    線程創建函數:int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine(void*),void *arg);

    返回值:成功返回0,失敗返回錯誤號。

    在一個線程中調用pthread_create()創建新的線程后,當前線程從pthread_create()返回繼續往下執行,而新的線程所執行的代碼由我們傳給pthread_create()的函數指針star_routine決定。pthread_create成功返回后,新創建的線程id被填寫到thread參數所指向的內存單元。線程id的類型是thread_t,它只在當前進程中保證是唯一的,在不同的系統中thread_t這個類型有不同的實現,它可能是一個整數值,也可能是一個結構體,也可能是一個地址,用pthread_self()可獲得當前線程id

    如果任意一個線程調用了exit_exit,則整個進程的所有線程都終止。

  2. 線程的終止:

    有以下三種方法終止線程:

                   從線程函數return,這種方法對主線程不適用,從main函數return相當于調用exit

         一個線程可以調用pthread_cancel終止統一進程中的另一個線程;

         程可以調用pthread_exit終自己;


下面我們看一段代碼,看看這3中方法的區別:

  #include <stdlib.h>

  #include <unistd.h>

  #include <pthread.h>

  #include <sys/types.h>                                                                                                                                              


  void *thread1(void *arg)

  {

      printf("thread 1 returning....\n");

      return (void*)1;

  }

  void *thread2(void *arg)

  {

      printf("thread 1 exiting....\n");

      pthread_exit((void*)2);

  }

  void *thread3(void *arg)

  {

      while(1)

      {

          printf("thread 3 is runing,wait to bu cancel...\n");

          sleep(1);

      }

      return NULL;

 }

  

  

  int main()

  {

      pthread_t tid;

      void *val;

  

     pthread_create(&tid,NULL,thread1,NULL);

     pthread_join(tid,&val);

     printf("thread return,thread id is:%u,return code is:%d\n",tid,(int)val);

 

     pthread_create(&tid,NULL,thread2,NULL);

     pthread_join(tid,&val);

     printf("thread exit,thread id is:%u,exit code is:%d\n",tid,(int)val);

 

     pthread_create(&tid,NULL,thread3,NULL);

     sleep(3);

     pthread_cancel(tid);                                                                                                                                 

     pthread_join(tid,&val);

     printf("thread return,thread id is:%u,return code is:%d\n",tid,(int)val);

     return 0;

 }

運行結果如下:

 線程的控制與分離

     一般情況下,線程終止后,其狀態一直保留到其他線程調用pthread_join獲取它的狀態為止,但是線程也可以被置為detach狀態,這樣的線程一旦終止,就立刻回收它所占有的所有資源,而不保留終止狀態,不能對一個處于detach狀態的線程調用pthread_join,這樣的調用將返回EINVAL,對一個尚未detach的線程調用pthread_joinpthread_detach都可以把該線程置為detach狀態。也就是說不能對一個線程調用兩次pthread_join 或者已經對一個線程調用了pthread_detach,就不能再調用pthread_join了。

 

線程分離

在任何一個時間點上,線程是可結合的或者是可分離的,一個可結合的線程能夠被其他線程收回其資源和殺死,在被其他線程收回之前,它的存儲資源是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,他的存儲器資源在它終止時由系統自動釋放。

默認情況下,線程被創建成可結合的,為了避免存儲器泄露,每個可結合線程要么被顯示的回收,要么調用pthread_detach函數被分離。

由于調用pthread_join后,如果該線程沒有運行結束,調用者會被阻塞,我們并不希望如此。我們這時可以在子線程代碼中加入pthread_detachpthread_self())或者父線程調用pthread_detachtid).這將子線程的狀態設置為分離的,該線程運行結束后會自動釋放所有資源。

下面我們看一段代碼:

 #include <stdio.h>

 #include <stdlib.h>

 #include <unistd.h>

 #include <pthread.h>

 #include <sys/types.h>

                                                                                                                                                                     

 void *thread(void *arg)

 {

     pthread_detach(pthread_self());

     printf("thread 1 returning....\n");

     return NULL;

}

 

 int main()

{

     pthread_t tid;

     int ret=pthread_create(&tid,NULL,thread,NULL);

     if(ret!=0)

     {

         printf("create thread error,info is :%s\n",strerror(ret));

     }

     sleep(1);

     if(0==pthread_join(tid,NULL))

     {

         printf("thread wait success\n");

     }

     else

     {

         printf("thread wait failed\n");

     }

     return 0;

 }

運行結果:

  線程的控制與分離

從結果可以看到,我們在子線程里面用了pthread_detach,在主線程里面又用了pthread_join,所以會wait failed

                                                                    

 

 

 

 

 

                                                              

 

 

 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

罗江县| 丘北县| 康保县| 襄樊市| 南江县| 永川市| 崇礼县| 分宜县| 丰台区| 沈丘县| 方正县| 宁南县| 吕梁市| 万年县| 江达县| 五河县| 阳山县| 云林县| 司法| 石台县| 永顺县| 剑阁县| 福泉市| 临城县| 西乌珠穆沁旗| 新兴县| 进贤县| 枣庄市| 德安县| 嵊州市| 通渭县| 平阴县| 彭水| 丹棱县| 巴南区| 绥芬河市| 绥中县| 甘德县| 嘉祥县| 石阡县| 盘山县|