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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux多线程编程(一)---多线程基本编程

發(fā)布時(shí)間:2024/4/18 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux多线程编程(一)---多线程基本编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/mybelief321/article/details/9377379

線程概念

? ? 線程是指運(yùn)行中的程序的調(diào)度單位。一個(gè)線程指的是進(jìn)程中一個(gè)單一順序的控制流,也被稱為輕量級線程。它是系統(tǒng)獨(dú)立調(diào)度和分配的基本單位。同一進(jìn)程中的多個(gè)線程將共享該系統(tǒng)中的全部系統(tǒng)資源,比如文件描述符和信號處理等。一個(gè)進(jìn)程可以有很多線程,每個(gè)線程并行執(zhí)行不同的任務(wù)。

線程與進(jìn)程比較

? ?① ?和進(jìn)程相比,它是一種非常“節(jié)儉”的多任務(wù)操作方式。在Linux系統(tǒng)中,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)其代碼段、堆棧段和數(shù)據(jù)段,這種多任務(wù)工作方式的代價(jià)非常“昂貴”。而運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間,而且線程間彼此切換所需要時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間。

? ?② ?線程間方便的通信機(jī)制。對不同進(jìn)程來說它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行。這種方式不僅費(fèi)時(shí),而且很不方便。線程則不然,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其他線程所用,不僅方便,而且快捷。

線程基本編程

? ?Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,連接時(shí)需要使用庫libpthread.a。因?yàn)閜thread的庫不是Linux系統(tǒng)的庫,所以在編譯時(shí)要加上 -lpthread。例如:gcc ?filename ?-lpthread。注意,這里要講的線程相關(guān)操作都是用戶空間中的線程的操作。

? ?線程創(chuàng)建:創(chuàng)建線程實(shí)際上就是確定調(diào)用該線程函數(shù)的入口點(diǎn),這里通常使用的函數(shù)是pthread_create()。在線程創(chuàng)建后,就開始運(yùn)行相關(guān)的線程函數(shù)。

??

? 線程退出:在線程創(chuàng)建后,就開始運(yùn)行相關(guān)的線程函數(shù),在該函數(shù)運(yùn)行完之后,該線程也就退出了,這也是線程退出的一種方法。另一種退出線程的方法是使用函數(shù)pthread_exit(),這是線程的主動(dòng)行為。這里要注意的是,在使用線程函數(shù)時(shí),不能隨意使用exit()退出函數(shù)來進(jìn)行出錯(cuò)處理。由于exit()的作用是使調(diào)用進(jìn)程終止,而一個(gè)進(jìn)程往往包含多個(gè)線程,因此,在使用exit()之后,該進(jìn)程中的所有線程都終止了。在線程中就可以使用pthread_exit()來代替進(jìn)程中的exit()。

??

? 線程等待:由于一個(gè)進(jìn)程中的多個(gè)線程是共享數(shù)據(jù)段的,因此,通常在線程退出后,退出線程所占用的資源并不會(huì)隨著線程的終止而得到釋放。正如進(jìn)程之間可以用wait()系統(tǒng)調(diào)用來同步終止并釋放資源一樣,線程之間也有類似機(jī)制,那就是pthread_join()函數(shù)。pthread_join()用于將當(dāng)前進(jìn)程掛起來等待線程的結(jié)束。這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源就被收回。

??

? 線程取消:前面已經(jīng)提到線程調(diào)用pthread_exit()函數(shù)主動(dòng)終止自身線程,但是在很多線程應(yīng)用中,經(jīng)常會(huì)遇到在別的線程中要終止另一個(gè)線程的問題,此時(shí)調(diào)用pthread_cancel()函數(shù)來實(shí)現(xiàn)這種功能,但在被取消的線程的內(nèi)部需要調(diào)用pthread_setcancel()函數(shù)和pthread_setcanceltype()函數(shù)設(shè)置自己的取消狀態(tài)。例如,被取消的線程接收到另一個(gè)線程的取消請求之后,是接受函數(shù)忽略這個(gè)請求;如果是接受,則再判斷立刻采取終止操作還是等待某個(gè)函數(shù)的調(diào)用等。

??

? 線程標(biāo)識符獲取:獲取調(diào)用線程的標(biāo)識ID。

??

? 線程清除:線程終止有兩種情況:正常終止和非正常終止。線程主動(dòng)調(diào)用pthread_exit()或者從線程函數(shù)中return都將使線程正常退出,這是可預(yù)見的退出方式;非正常終止是線程在其它線程的干預(yù)下,或者由于自身運(yùn)行出錯(cuò)(比如訪問非法地址)而退出,這種退出方式是不可預(yù)見的。不論是可預(yù)見的線程終止還是異常終止,都回存在資源釋放的問題,如何保證線程終止時(shí)能順利地釋放掉自己所占用的資源,是一個(gè)必須考慮的問題。

? 從pthread_cleanup_push()的調(diào)用點(diǎn)到pthread_cleanup_pop()之間的程序段中的終止動(dòng)作(包括調(diào)用pthread_exit()和異常終止,不包括return)都將執(zhí)行pthread_cleanup_push()所指定的清理函數(shù)。

??

? ?

實(shí)驗(yàn)1

? ?功能:使用pthread_create()函數(shù)創(chuàng)建線程的實(shí)例

? ?代碼:thread_create.c文件

? ??

? ? ?

? ? 編譯:使用命令:gcc thread_create.c -o thread_create -lpthread編譯,注意不要忘了加 -lpthread,否則會(huì)出現(xiàn)如下的錯(cuò)誤

/tmp/ccjfZIN3.o: In function `main':
thread_create.c:(.text+0x8b): undefined reference to `pthread_create'
thread_create.c:(.text+0xc0): undefined reference to `pthread_create'
thread_create.c:(.text+0xeb): undefined reference to `pthread_join'
thread_create.c:(.text+0xfc): undefined reference to `pthread_join'
collect2: ld returned 1 exit status

? ?執(zhí)行:

? ?

實(shí)驗(yàn)2

? 功能:使用pthread_exit()函數(shù)退出線程的舉例

? 代碼:thread_exit.c文件

? ? ?

? 編譯:gcc thread_exit.c -o thread_exit -lpthread

? 執(zhí)行:./thread_exit

??

實(shí)驗(yàn)3

? 功能:用pthread_join()實(shí)現(xiàn)線程等待。

? 代碼:thread_join.c文件

??

? 編譯:gcc thread_join.c -o thread_join -lpthread??

? 執(zhí)行:./thread_join

??

?可以看出,pthread_join()等到線程結(jié)束后,程序才繼續(xù)執(zhí)行。

實(shí)驗(yàn)4

? 功能:使用pthread_self()獲取線程ID

? 代碼:thread_id.c文件

??

? 編譯:gcc thread_id.c -o thread_id -lpthread

? 執(zhí)行:./thread_id

??

實(shí)驗(yàn)5

? 功能:線程清理函數(shù)的使用

? 代碼:thread_clean.c

??

??

? ?

? ?注意,在編寫的代碼的時(shí)候,自己修改一下傳遞的參數(shù)和clean_pop函數(shù)的參數(shù),相信你會(huì)更有收獲。

? 編譯:gcc thread_clean.c -o thread_clean -lpthread

? 執(zhí)行:./thread_clean

? ?

實(shí)驗(yàn)6

? 功能:本實(shí)驗(yàn)創(chuàng)建了3個(gè)進(jìn)程,為了更好的描述線程之間的并行執(zhí)行,讓3個(gè)線程共用同一個(gè)執(zhí)行函數(shù)。每個(gè)線程都有5次循環(huán)(可以看成5個(gè)小任務(wù)),每次循環(huán)之間會(huì)隨機(jī)等待1~10s的時(shí)間,意義在于模擬每個(gè)任務(wù)的到達(dá)時(shí)間是隨機(jī)的,并沒有任何特定的規(guī)律。

? 代碼:thread.c文件,該代碼文件點(diǎn)此下載

??

??

? 編譯:gcc thread.c -o thread -lpthread

? 執(zhí)行:./thread

? ??

? 從實(shí)驗(yàn)結(jié)果可以看出,線程執(zhí)行的順序雜亂無章的,看著就頭疼,下一節(jié)就利用線程之間的同步與互斥機(jī)制處理此文件http://blog.csdn.net/mybelief321/article/details/9390707

總結(jié)

以上是生活随笔為你收集整理的Linux多线程编程(一)---多线程基本编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。