亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

Linux多線程編程快速入門

2024-09-05 23:04:33
字體:
來源:轉載
供稿:網友

本文主要對Linux下的多線程進行一個入門的介紹,雖然是入門,但是十分詳細,希望大家通過本文所述,對Linux多線程編程的概念有一定的了解。具體如下。

1 線程基本知識

進程是資源管理的基本單元,而線程是系統調度的基本單元,線程是操作系統能夠進行調度運算的最小單位,它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。

一個進程在某一個時刻只能做一件事情,有了多個控制線程以后,在程序的設計成在某一個時刻能夠做不止一件事,每個線程處理獨自的任務。

需要注意的是:即使程序運行在單核處理器上,也能夠得到多線程編程模型的好處。處理器的數量并不影響程序結構,所以不管處理器個數多少,程序都可以通過線程得以簡化。

linux操作系統使用符合POSIX線程作為系統標準線程,該POSIX線程標準定義了一整套操作線程的API。

2. 線程標識

與進程有一個ID一樣,每個線程有一個線程ID,所不同的是,進程ID在整個系統中是唯一的,而線程是依附于進程的,其線程ID只有在所屬的進程中才有意義。線程ID用pthread_t表示。

//pthread_self直接返回調用線程的IDinclude <pthread.h>pthread_t pthread_self(void);

判斷兩個線程ID的大小是沒有任何意義的,但有時可能需要判斷兩個給定的線程ID是否相等,使用以下接口:

//pthread_equal如果t1和t2所指定的線程ID相同,返回0;否則返回非0值。include <pthread.h>int pthread_equal(pthread_t t1, pthread_t t2);

3. 線程創建

一個線程的生命周期起始于它被創建的那一刻,創建線程的接口:

#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

函數參數:

thread(輸出參數),由pthread_create在線程創建成功后返回的線程句柄,該句柄在后續操作線程的API中用于標志該新建的線程; start_routine(輸入參數),新建線程的入口函數; arg(輸入參數),傳遞給新線程入口函數的參數; attr(輸入參數),指定新建線程的屬性,如線程棧大小等;如果值為NULL,表示使用系統默認屬性。

函數返回值:

成功,返回0; 失敗,返回相關錯誤碼。

需要注意:

1.主線程,這是一個進程的初始線程,其入口函數為main函數。
2.新線程的運行時機,一個線程被創建之后有可能不會被馬上執行,甚至,在創建它的線程結束后還沒被執行;也有可能新線程在當前線程從pthread_create前就已經在運行,甚至,在pthread_create前從當前線程返回前新線程就已經執行完畢。

程序實例:

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>void printids(const char *s){ pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s, pid %lu tid %lu (0x%lx)/n",s,(unsigned long)pid,(unsigned long)tid, (unsigned long)tid);}void *thread_func(void *arg){ printids("new thread: "); return ((void*)0);}int main() { int err; pthread_t tid; err = pthread_create(&tid,NULL,thread_func,NULL); if (err != 0) {  fprintf(stderr,"create thread fail./n"); exit(-1);  } printids("main thread:"); sleep(1);  return 0;}

注意上述的程序中,主線程休眠一秒,如果不休眠,則主線程不休眠,則其可能會退出,這樣新線程可能不會被運行,我自己注釋掉sleep函數,發現好多次才能讓新線程輸出。

編譯命令:

gcc -o thread thread.c -lpthread

運行結果如下:

main thread:, pid 889 tid 139846854309696 (0x7f30a212f740)new thread: , pid 889 tid 139846845961984 (0x7f30a1939700)

可以看到兩個線程的進程ID是相同的。其共享進程中的資源。

4. 線程終止

線程的終止分兩種形式:被動終止和主動終止

被動終止有兩種方式:

1.線程所在進程終止,任意線程執行exit、_Exit或者_exit函數,都會導致進程終止,從而導致依附于該進程的所有線程終止。
2.其他線程調用pthread_cancel請求取消該線程。

主動終止也有兩種方式:

1.在線程的入口函數中執行return語句,main函數(主線程入口函數)執行return語句會導致進程終止,從而導致依附于該進程的所有線程終止。
2.線程調用pthread_exit函數,main函數(主線程入口函數)調用pthread_exit函數, 主線程終止,但如果該進程內還有其他線程存在,進程會繼續存在,進程內其他線程繼續運行。

線程終止函數:

include <pthread.h>void pthread_exit(void *retval);

線程調用pthread_exit函數會導致該調用線程終止,并且返回由retval指定的內容。
注意:retval不能指向該線程的棧空間,否則可能成為野指針!

5. 管理線程的終止

5.1 線程的連接

一個線程的終止對于另外一個線程而言是一種異步的事件,有時我們想等待某個ID的線程終止了再去執行某些操作,pthread_join函數為我們提供了這種功能,該功能稱為線程的連接:

include <pthread.h>int pthread_join(pthread_t thread, void **retval);

參數說明:

thread(輸入參數),指定我們希望等待的線程 retval(輸出參數),我們等待的線程終止時的返回值,就是在線程入口函數中return的值或者調用pthread_exit函數的參數

返回值:

成功時,返回0 錯誤時,返回正數錯誤碼

當線程X連接線程Y時,如果線程Y仍在運行,則線程X會阻塞直到線程Y終止;如果線程Y在被連接之前已經終止了,那么線程X的連接調用會立即返回。

連接線程其實還有另外一層意義,一個線程終止后,如果沒有人對它進行連接,那么該終止線程占用的資源,系統將無法回收,而該終止線程也會成為僵尸線程。因此,當我們去連接某個線程時,其實也是在告訴系統該終止線程的資源可以回收了。

注意:對于一個已經被連接過的線程再次執行連接操作, 將會導致無法預知的行為!

5.2 線程的分離

有時我們并不在乎某個線程是不是已經終止了,我們只是希望如果某個線程終止了,系統能自動回收掉該終止線程所占用的資源。pthread_detach函數為我們提供了這個功能,該功能稱為線程的分離:

#include <pthread.h>int pthread_detach(pthread_t thread);

默認情況下,一個線程終止了,是需要在被連接后系統才能回收其占有的資源的。如果我們調用pthread_detach函數去分離某個線程,那么該線程終止后系統將自動回收其資源。

/** 文件名: thread_sample1.c* 描述:演示線程基本操作*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>/*子線程1入口函數*/void *thread_routine1(void *arg){ fprintf(stdout, "thread1: hello world!/n"); sleep(1); /*子線程1在此退出*/ return NULL;}/*子線程2入口函數*/void *thread_routine2(void *arg){ fprintf(stdout, "thread2: I'm running.../n"); pthread_t main_thread = (pthread_t)arg; /*分離自我,不能再被連接*/ pthread_detach(pthread_self()); /*判斷主線程ID與子線程2ID是否相等*/ if (!pthread_equal(main_thread, pthread_self())) {  fprintf(stdout, "thread2: main thread id is not equal thread2/n"); } /*等待主線程終止*/ pthread_join(main_thread, NULL); fprintf(stdout, "thread2: main thread exit!/n"); fprintf(stdout, "thread2: exit!/n"); fprintf(stdout, "thread2: process exit!/n"); /*子線程2在此終止,進程退出*/ pthread_exit(NULL);}int main(int argc, char *argv[]){ /*創建子線程1*/ pthread_t t1; if (pthread_create(&t1, NULL, thread_routine1, NULL)!=0) {  fprintf(stderr, "create thread fail./n");  exit(-1); } /*等待子線程1終止*/ pthread_join(t1, NULL); fprintf(stdout, "main thread: thread1 terminated!/n/n"); /*創建子線程2,并將主線程ID傳遞給子線程2*/ pthread_t t2; if (pthread_create(&t2, NULL, thread_routine2, (void *)pthread_self())!=0) {  fprintf(stderr, "create thread fail./n");  exit(-1); } fprintf(stdout, "main thread: sleeping.../n"); sleep(3); /*主線程使用pthread_exit函數終止,進程繼續存在*/ fprintf(stdout, "main thread: exit!/n"); pthread_exit(NULL);  fprintf(stdout, "main thread: never reach here!/n"); return 0;}

最終的執行結果如下:

thread1: hello world!main thread: thread1 terminated!main thread: sleeping...thread2: I'm running...thread2: main thread id is not equal thread2main thread: exit!thread2: main thread exit!thread2: exit!thread2: process exit!

總結

以上就是本文關于Linux多線程編程快速入門的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩视频欧美视频| 亚洲第一区中文99精品| 日韩va亚洲va欧洲va国产| 亚洲欧美激情精品一区二区| 92版电视剧仙鹤神针在线观看| 国产精品久久久久久亚洲调教| 日本a级片电影一区二区| 中文字幕精品—区二区| 国产精品一区二区三区久久久| 97国产一区二区精品久久呦| 亚洲午夜久久久久久久| 久久全球大尺度高清视频| 国产成人精品视| 韩曰欧美视频免费观看| 亚洲精品按摩视频| 91精品国产91久久久久久吃药| 欧美激情综合亚洲一二区| 欧洲精品毛片网站| 日韩精品在线观看网站| 一区二区三区高清国产| 亚洲人成自拍网站| 国产精品久久91| 国产精品精品视频一区二区三区| 热久久这里只有精品| 国产精品h片在线播放| 国产精品稀缺呦系列在线| 日韩精品www| 欧美国产在线电影| 日韩视频永久免费观看| 日韩av中文字幕在线免费观看| 国产91ⅴ在线精品免费观看| 亚洲一区二区国产| 精品日韩中文字幕| 日韩视频免费观看| 欧美日韩ab片| 欧美日韩第一页| 国产97色在线| 欧美国产在线电影| 国产成人黄色av| 国产69精品99久久久久久宅男| 欧美日韩国产限制| 2025国产精品视频| 亚洲图片在线综合| 97视频在线观看免费| 欧美视频在线观看免费| 亚洲视频在线观看网站| 日韩女优在线播放| 国产精品中文在线| 国产成人精品在线播放| 美日韩丰满少妇在线观看| 性欧美激情精品| 精品久久久久久中文字幕大豆网| 亚洲精品国精品久久99热| 欧美乱大交xxxxx另类电影| 日韩精品视频在线观看网址| 亚洲天堂网在线观看| 九九热精品在线| 精品国产一区二区三区久久狼黑人| 九九精品在线视频| 欧美在线一区二区视频| 日本一欧美一欧美一亚洲视频| 久久影院模特热| 欧洲中文字幕国产精品| 热久久视久久精品18亚洲精品| 久久久电影免费观看完整版| 成人午夜小视频| 国产成人精品视| 亚洲一区二区久久久久久久| 亚洲字幕一区二区| 日韩精品中文在线观看| 色阁综合伊人av| 精品久久久久久久久久ntr影视| 热99精品只有里视频精品| 国产精品免费久久久久影院| www亚洲欧美| 午夜精品美女自拍福到在线| 国产欧美精品在线| 欧美疯狂xxxx大交乱88av| 亚洲乱码一区二区| 91超碰中文字幕久久精品| 国产乱肥老妇国产一区二| 一区二区在线免费视频| 国产精品一二三视频| 精品久久香蕉国产线看观看gif| 欧美性猛交xxxx乱大交极品| 国色天香2019中文字幕在线观看| 亚洲欧美一区二区三区四区| 久久久91精品国产| 亚洲欧美在线免费| 中文欧美在线视频| 亚洲精品mp4| 精品国产拍在线观看| 午夜精品一区二区三区在线视| 日韩精品在线影院| 中国人与牲禽动交精品| 亚洲欧美激情视频| 26uuu亚洲国产精品| 精品网站999www| 国产精品视频久久| 在线精品播放av| 欧美性xxxx| 欧美做受高潮电影o| 91久久久久久久久久久| 欧美大片在线看| 国产自产女人91一区在线观看| 久久视频在线免费观看| 精品国产欧美一区二区三区成人| 亚洲新声在线观看| 国产欧美亚洲视频| 国产婷婷成人久久av免费高清| 国产精品日韩在线一区| 日韩国产欧美精品一区二区三区| 日韩在线激情视频| 日本成人在线视频网址| 亚洲国产免费av| 国产精品国产自产拍高清av水多| 亚洲网址你懂得| 亚洲精品在线视频| 亚洲大尺度美女在线| 国产精品嫩草视频| 欧美视频13p| 国产一区二区三区直播精品电影| 亚洲aⅴ男人的天堂在线观看| 狠狠操狠狠色综合网| 欧美日韩国产综合视频在线观看中文| 欧美激情xxxx性bbbb| 亚洲精品美女视频| 久久久人成影片一区二区三区| 久久亚洲私人国产精品va| 国产成人精品久久亚洲高清不卡| 97在线视频免费观看| 乱亲女秽乱长久久久| 欧美在线不卡区| 91免费精品视频| 成人网欧美在线视频| 国产精品美女av| 国产成人高清激情视频在线观看| 亚洲人精品午夜在线观看| 久久国产精品久久久久| 日韩av网站导航| 精品中文字幕久久久久久| 日韩精品在线观看视频| 国产日韩欧美夫妻视频在线观看| 成人午夜在线影院| 国产精品入口日韩视频大尺度| 成人激情视频小说免费下载| 黑人精品xxx一区一二区| 久久久之久亚州精品露出| 亚洲国模精品私拍| 午夜精品久久久久久久久久久久| 国产精品1区2区在线观看| 亚洲无限乱码一二三四麻| 成人网在线免费观看| 中文字幕欧美精品在线| 亚洲成人免费网站| 不卡av在线播放| 搡老女人一区二区三区视频tv| 自拍视频国产精品| 国产91|九色| 亚洲在线视频观看| 欧美日韩一区二区免费在线观看| 91久久久久久久久| 欧美多人爱爱视频网站| 久久夜色精品亚洲噜噜国产mv|