中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Linux系統中如何創建線程

發布時間:2022-01-25 10:05:03 來源:億速云 閱讀:125 作者:小新 欄目:開發技術

小編給大家分享一下Linux系統中如何創建線程,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

線程創建

在傳統Unix進程模型中,每個進程只有一個控制線程。在POSIX線程(pthread)的情況下,程序開始運行時,它也是以單進程中的單個控制線程啟動的。在創建多個控制線程以前,程序的行為與傳統的進程并沒有什么區別。新增的線程可以通過調用pthread_create函數創建。

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

說明:當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);
 }
 1234567891011121314151617181920212223242526272829303132333435363738394041424344

編譯: 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)
 12

可以見到,兩個線程地址是不一樣的,但是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());
 }
 12345678910111213141516171819202122232425262728293031

因為在Unix環境高級編程的源代碼里代碼都是使用makefile鏈接的,小弟不懂,所以直接將代碼copy到已有的文件名中跑了。 下面是結果: Linux系統中如何創建線程 可以看到結果:創建的線程和主線程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

河津市| 二手房| 石首市| 报价| 景泰县| 安康市| 北海市| 阜南县| 仲巴县| 义乌市| 铜梁县| 金秀| 句容市| 邛崃市| 沾益县| 乐东| 通州区| 霍邱县| 金坛市| 泰州市| 莱阳市| 启东市| 溧水县| 高清| 西吉县| 简阳市| 汤阴县| 烟台市| 辉南县| 亚东县| 巨野县| 泰宁县| 于田县| 项城市| 太谷县| 宜宾市| 漠河县| 眉山市| 牙克石市| 沅陵县| 北川|