亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Linux系統如何創建線程

發布時間:2022-01-25 09:57:12 來源:億速云 閱讀:244 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Linux系統如何創建線程”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Linux系統如何創建線程”這篇文章吧。

在創建多個控制線程以前,程序的行為與傳統的進程并沒有什么區別。新增的線程可以通過調用pthread_create函數創建。

  #include 
  int pthread_create(pthread_t *restrict tidp,
                              const pthread_attr_t *restrict attr,
                              void *(*start_rtn)(void *), void *restrict arg);

說明:當pthread_create成功返回時,新創建線程的線程ID會被設置成tidp指向的內存單元。attr參數用于定制各種不同的線程屬性,目前設置為NULL,創建一個具有默認屬性的線程。 新創建的線程從start_rtn函數的地址開始運行,該函數只有一個無類型指針參數arg。如果需要想start_rtn函數傳遞的參數有一個以上,那么需要把這些參數放到一個結構中,然后把這個結構的地址作為arg參數傳入。

例子 創建一個線程,打印進程ID、新線程的線程ID以及初始線程的ID。

  //gcc threadid.c -o a.out -pthread
  //pthread是linux下的線程庫,用了多線程就要鏈接這個庫,這時候要在編譯選項上增加-pthread
  #include "apue.h"
  #include  #include 
 
  pthread_t ntid;
 
  void
  printids(const char *s)
  {
      //聲明進程id
      pid_t       pid;
      //聲明線程id
      pthread_t   tid;
      //獲取進程id
      pid = getpid();
      //用pthread_self()獲取自己線程id
      tid = pthread_self();
      printf("%s pid %lu tid %lu (0x%lx)\n", s, (unsigned long)pid,
        (unsigned long)tid, (unsigned long)tid);
  }
 
  void *
  thr_fn(void *arg)
  {
      //調用上面的打印id函數
      printids("new thread: ");
      return((void *)0);
  }
 
  int
  main(void)
  {
      int     err;
 
      //創建線程,主線程把新線程ID存放在ntid中,新線程去執行thr_fn函數
      err = pthread_create(&ntid, NULL, thr_fn, NULL);
      if (err != 0)
          err_exit(err, "can't create thread");
      printids("main thread:");
      sleep(1);
      exit(0);
  }

編譯: gcc threadid.c -o a.out -pthread note:pthread是linux下的線程庫,用了多線程就要鏈接這個庫,這時候要在編譯選項上增加-pthread

main thread: pid 1518 tid 140627397551936 (0x7fe65e13a740) new thread: pid 1518 tid 140627389191936 (0x7fe65d941700)

可以見到,兩個線程地址是不一樣的,但是pid父進程都是一樣的。

另一個例子 主線程接受一個輸入num,創建一個線程打印2*num。

  #include  #include  #include  #include 
 
  // 返回值必須是void *(無類型指針),參數也必須是void *
  void *tfn(void *arg)
  {
      //傳進來的是(void *),強制類型轉換
      int num = (int)arg;
      long d2num = 2*num;
      printf("In thread %lu arg: %d.\n", (unsigned long)pthread_self(), num);
      sleep(1);
      printf("Thread over! arg: %d\n", num);
      return  (void*)d2num;
  }
 
  void main(int argc, char *argv[])
  {
      pthread_t tid;
      long num;
      void *tret; //獲取線程終止狀態
      while(scanf("%ld", &num) == 1){
          pthread_create(&tid, NULL, tfn, (void *)num);
          //線程終止
          pthread_join(tid, &tret);
          printf("Thread exit code: %ld\n", (long)tret);
      }
 
      printf("Main thread %lu is over.\n", (unsigned long)pthread_self());
 
  }

因為在Unix環境高級編程的源代碼里代碼都是使用makefile鏈接的,小弟不懂,所以直接將代碼copy到已有的文件名中跑了。 下面是結果:

可以看到結果:創建的線程和主線程id號是不一樣的。 另外:我覺的在 pthread_create(&tid, NULL, tfn, (void *)num); 直接將num轉為指針有點別扭,于是這樣: pthread_create(&tid, NULL, tfn, (void *)&num); 然后在tfn函數中將: int num = (int)arg; 改為: int num = (int)arg; 也是可以的。

以上是“Linux系統如何創建線程”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

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

AI

昌邑市| 尚志市| 成都市| 扶风县| 西畴县| 阳城县| 凌海市| 麻阳| 大渡口区| 依安县| 桂林市| 土默特右旗| 隆尧县| 沙坪坝区| 德令哈市| 新安县| 大姚县| 吴旗县| 南召县| 泸西县| 青铜峡市| 拉萨市| 十堰市| 沅陵县| 济阳县| 衢州市| 临邑县| 梁平县| 绥中县| 淳化县| 海盐县| 新田县| 蒙自县| 凤山市| 方正县| 湖州市| 临泉县| 潞城市| 肇州县| 景谷| 青岛市|