一文搞懂多線程中各個(gè)難點(diǎn)
1.什么是線程?
linux內(nèi)核中是沒有線程這個(gè)概念的,而是輕量級進(jìn)程的概念:LWP。一般我們所說的線程概念是C庫當(dāng)中的概念。
1.1線程是怎樣描述的?
線程實(shí)際上也是一個(gè)task_struct,工作線程拷貝主線程的task_struct,然后共用主線程的mm_struct。線程ID是在用task_struct中pid描述的,而task_struct中tgid是線程組ID,表示線程屬于該線程組,對于主線程而言,其pid和tgid是相同的,我們一般看到的進(jìn)程ID就是tgid。
即:
獲取線程ID和主線程ID的值:
但是獲取該gettid系統(tǒng)調(diào)用接口并沒有被封裝起來,如果確實(shí)需要獲取線程ID,可使用:
#include
則對線程組而言,所有的tgid一定是一樣的,所有的pid一定是不一樣的。主線程pid和tgid一樣,工作線程pid和tgid一定不一樣。
1.2如何查看一個(gè)線程的ID
命令:ps -eLf
上述polkitd進(jìn)程是多線程的,進(jìn)程ID為731,進(jìn)程內(nèi)有6個(gè)線程,線程ID為731,764,765,768,781,791。
1.3多線程如何避免調(diào)用;靵y的問題?
工作線程和主線程共用一個(gè)mm_struct,如果都向棧中壓棧,必然會(huì)導(dǎo)致調(diào)用棧出錯(cuò)。
實(shí)際上工作線程壓棧是壓了共享區(qū),該共享區(qū)包含了許多線程獨(dú)有的資源。如圖:
每一個(gè)線程,默認(rèn)在共享區(qū)中占有的空間為8M,可以使用ulimit -s修改。
進(jìn)程是資源分配的基本單位,線程是調(diào)度的基本單位。
1.3.1線程獨(dú)有資源
線程ID
一組寄存器
errno
信號(hào)屏蔽字
調(diào)度優(yōu)先級
1.3.2線程共享資源和環(huán)境
文件描述符表
信號(hào)的處理方式
當(dāng)前工作目錄
用戶id和組id
1.4為什么要有多線程?
舉個(gè)生活中的例子, 這就好比去銀行辦理業(yè)務(wù)。到達(dá)銀行后, 首先取一個(gè)號(hào)碼, 然后坐下來安心等待。這時(shí)候你一定希望, 辦理業(yè)務(wù)的窗口越多越好。如果把整個(gè)營業(yè)大廳當(dāng)成一個(gè)進(jìn)程的話, 那么每一個(gè)窗口就是一個(gè)工作線程。
1.4.1線程帶來的優(yōu)勢
1、線程會(huì)共享內(nèi)存地址空間。
2、創(chuàng)建線程花費(fèi)的時(shí)間要少于創(chuàng)建進(jìn)程花費(fèi)的時(shí)間。
3、終止線程花費(fèi)的時(shí)間要少于終止進(jìn)程花費(fèi)的時(shí)間。
4、線程之間上下文切換的開銷, 要小于進(jìn)程之間的上下文切換。
5、線程之間數(shù)據(jù)的共享比進(jìn)程之間的共享要簡單。
6、充分利用多處理器的可并行數(shù)量。(線程會(huì)提高運(yùn)行效率,但當(dāng)線程多到一定程度后,可能會(huì)導(dǎo)致效率下降,因?yàn)闀?huì)有線程調(diào)度切換。)
1.4.2線程帶來的缺點(diǎn)
健壯性降低:多個(gè)線程之中, 只要有一個(gè)線程不夠健壯存在bug(如訪問了非法地址引發(fā)的段錯(cuò)誤) , 就會(huì)導(dǎo)致進(jìn)程內(nèi)的所有線程一起完蛋。
線程模型作為一種并發(fā)的編程模型, 效率并沒有想象的那么高, 會(huì)出現(xiàn)復(fù)雜度高、 易出錯(cuò)、 難以測試和定位的問題。
1.5注意
1、并不是只有主線程才能創(chuàng)建線程, 被創(chuàng)建出來的線程同樣可以創(chuàng)建線程。
2、不存在類似于fork函數(shù)那樣的父子關(guān)系, 大家都?xì)w屬于同一個(gè)線程組, 進(jìn)程ID都相等, group_leader都指向主線程, 而且各有各的線程ID。
通過group_leader指針, 每個(gè)線程都能找到主線程。主線程存在一個(gè)鏈表頭,后面創(chuàng)建的每一個(gè)線程都會(huì)鏈入到該雙向鏈表中。
3、并非只有主線程才能調(diào)用pthread_join連接其他線程, 同一線程組內(nèi)的任意線程都可以對某線程執(zhí)行pthread_join函數(shù)。
4、并非只有主線程才能調(diào)用pthread_detach函數(shù), 其實(shí)任意線程都可以對同一線程組內(nèi)的線程執(zhí)行分離操作。
線程的對等關(guān)系:
2.線程創(chuàng)建
接口:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
參數(shù)解釋
1、thread:線程標(biāo)識(shí)符,是一個(gè)出參
2、attr:線程屬性
3、star_routine:函數(shù)指針,保存線程入口函數(shù)的地址
4、arg:給線程入口函數(shù)傳參
返回值:成功返回0,失敗返回error number
詳解:
第一個(gè)參數(shù)是pthread_t類型的指針, 線程創(chuàng)建成功的話,會(huì)將分配的線程ID填入該指針指向的地址。線程的后續(xù)操作將使用該值作為線程的唯一標(biāo)識(shí)。
第二個(gè)參數(shù)是pthread_attr_t類型, 通過該參數(shù)可以定制線程的屬性, 比如可以指定新建線程棧的大小、 調(diào)度策略等。如果創(chuàng)建線程無特殊的要求, 該值也可以是NULL, 表示采用默認(rèn)屬性。
第三個(gè)參數(shù)是線程需要執(zhí)行的函數(shù)。創(chuàng)建線程, 是為了讓線程執(zhí)行一定的任務(wù)。線程創(chuàng)建成功之后, 該線程就會(huì)執(zhí)行start_routine函數(shù), 該函數(shù)之于線程, 就如同main函數(shù)之于主線程。
第四個(gè)參數(shù)是新建線程執(zhí)行的start_routine函數(shù)的入?yún)ⅰ?/p>
pthread_create錯(cuò)誤碼及描述:
2.1傳入?yún)?shù)arg的選擇
不要使用臨時(shí)變量傳參,使用堆上開辟的變量可以。
例:
#include
線程獲取自身的ID:
#include
判斷兩個(gè)線程ID是否對應(yīng)著同一個(gè)線程:
#include
返回為0時(shí),則表示兩個(gè)線程為同一個(gè)線程,非0時(shí),表示不是同一個(gè)線程。
用戶調(diào)用pthread_create函數(shù)時(shí), 首先要為線程分配線程棧, 而線程棧的位置就落在共享區(qū)。調(diào)用mmap函數(shù)為線程分配?臻g。pthread_create函數(shù)分配的pthread_t類型的線程ID, 不過是分配出來的空間里的一個(gè)地址, 更確切地說是一個(gè)結(jié)構(gòu)體的指針。
即:
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬億獨(dú)角獸,AI人才之爭開啟
- 高級軟件工程師 廣東省/深圳市
- 自動(dòng)化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市