日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux编程练习 --多线程1--线程创建

發布時間:2023/12/10 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux编程练习 --多线程1--线程创建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

POSIX線程—輕量級進程,線程調度是由內核調度程序完成的,線程所消耗的系統資源比較少,相互通訊也比較容易。

多線程的優點:

1.資源消耗量少。我們知道,在Linux系統下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統上,這個數據可能會有較大的區別。

2.通信方便。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其它線程所用,這不僅快捷,而且方便。當然,數據的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明為static的數據更有可能給多線程程序帶來災難性的打擊,這些正是編寫多線程程序時最需要注意的地方。

應用多進程的應用程序具有以下優點:

1) 提高應用程序響應。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術,將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況。
  2) 使多CPU系統更加有效。操作系統會保證當線程數不大于CPU數目時,不同的線程運行于不同的CPU上。
  3) 改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。

?

好了,看了多線程的特點后,馬上練習一下

需要的頭文件:pthread.h

線程標識符:pthread_t???????在頭文件/usr/include/bits/pthreadtypes.h中定義:

typedef??unsigned long int??pthread_t;

線程函數:

(1)extern int pthread_create __P ((pthread_t *__thread,//?指向線程標識符的指針

?__const pthread_attr_t *__attr,//?設置線程屬性

  ????????????????????????????????????void *(*__start_routine) (void *),//線程運行函數的起始地址

?void *__arg));//?運行函數的參數

當創建線程成功時,函數返回0,若不為0則說明創建線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統限制創建新的線程,例如線程數目過多了;后者表示第二個參數代表的線程屬性值非法。創建線程成功后,新創建的線程則運行參數三和參數四確定的函數,原來的線程則繼續運行下一行代碼。

?

(2)#include <pthread.h>

extern void pthread_exit __P ((void *__retval)) //函數的返回代碼

(3)等待一個線程的結束

oNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left;" align="left">#include <pthread.h>

???????????????extern int pthread_join __P ((pthread_t __th, //被等待的線程標識符

void **__thread_return));//?一個用戶定義的指針,它可以用來存儲被等待線程的返回值

這個函數是一個線程阻塞的函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。

?

下面在linux環境下編寫 :

[cpp]?view plaincopy
  • /*threadtest.c*/??
  • #include?<stdlib.h>????
  • #include?<stdio.h>????
  • #include?<pthread.h>????
  • #include?<errno.h>?????
  • /*聲明線程運行服務程序*/??
  • static?void?pthread_func_1?(void);?????
  • static?void?pthread_func_2?(void);?????
  • ????
  • int?main?(void)?????
  • {?????
  • ?/*線程的標識符*/??
  • ??pthread_t?pt_1?=?0;?????
  • ??pthread_t?pt_2?=?0;?????
  • ??int?ret?=?0;?????
  • ????
  • ??/*分別創建線程1、2*/??
  • ??ret?=?pthread_create?(&pt_1,??????????//線程標識符指針??
  • ?????????????NULL,??????????//默認屬性??
  • ?????????????(void?*)pthread_func_1,//運行函數??
  • ?????????????NULL);?????????//無參數??
  • ??if?(ret?!=?0)?????
  • ??{?????
  • ?????perror?("pthread_1_create");?????
  • ??}?????
  • ????
  • ??ret?=?pthread_create?(&pt_2,??????????//線程標識符指針??
  • ????????????NULL,???????????//默認屬性????
  • ????????????(void?*)pthread_func_2,?//運行函數??
  • ????????????NULL);??????????//無參數??
  • ??if?(ret?!=?0)?????
  • ??{?????
  • ?????perror?("pthread_2_create");?????
  • ??}?????
  • ??/*等待線程1、2的結束*/??
  • ??pthread_join?(pt_1,?NULL);?????
  • ??pthread_join?(pt_2,?NULL);?????
  • ??/*主線程退出*/??
  • ??printf?("main?programme?exit!/n");???
  • ??return?0;?????
  • }?????
  • /*線程1的服務程序*/??
  • static?void?pthread_func_1?(void)?????
  • {?????
  • ??int?i?=?0;?????
  • ???????
  • ??for?(;?i?<?6;?i++)?????
  • ??{?????
  • ????printf?("This?is?pthread1!/n");?????
  • ????
  • ????/*i==2時退出,即循環3次*/??
  • ????if?(i?==?2)?????
  • ????{?????
  • ??????pthread_exit?(0);?????
  • ????}?????
  • ????
  • ????sleep?(1);?????
  • ??}?????
  • }?????
  • /*線程2的服務程序*/???
  • static?void?pthread_func_2?(void)?????
  • {?????
  • ??int?i?=?0;?????
  • ????
  • ??for?(;?i?<?3;?i++)?????
  • ??{?????
  • ????printf?("This?is?pthread2!/n");?????
  • ??}?????
  • ????
  • ??pthread_exit?(0);?????
  • }????
  • ?

    編譯:

    $ gcc threadtest.c -lpthread -o threadtest

    運行:

    $ ./threadtest

    好,運行結果如下:

    This is pthread1!

    This is pthread2!

    This is pthread2!

    This is pthread2!

    This is pthread1!

    This is pthread1!

    main programme exit!

    ?

    上面例子很清楚地看出各個線程間的運行情況

    總結

    以上是生活随笔為你收集整理的Linux编程练习 --多线程1--线程创建的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。