引言:
北京時(shí)間:2023/6/29/15:33,剛剛更新完博客,目前沒什么狀態(tài),不好趁熱打鐵,需要去睡一會(huì)會(huì),昨天睡的有點(diǎn)遲,然后忘記把7點(diǎn)到8點(diǎn)30之間的4個(gè)鬧鐘關(guān)掉了,惡心了我自己一早上,真的是罪過呀!極度沒睡好加沒睡夠,由于上篇博客馬上就可以完成,所以中午沒有選擇睡覺,而是想著更新完再睡,但是現(xiàn)在困意不是很重,所以趁著這個(gè)沒什么狀態(tài)期間,將該篇博客的引言寫寫,然后把git提交一下,并且重點(diǎn)是今天出成績(jī)啦!在持續(xù)擺爛中,和預(yù)想的一樣,考的不怎么樣,不過好在都及格了,其中高數(shù)應(yīng)該是老師撈起來的,低分飄過,哈哈哈!擺爛過程只有我自己知道,具體不好形容,所以只要沒有掛科我就已經(jīng)很滿足了,不過對(duì)于我來說更重要的是,信號(hào)有關(guān)知識(shí)在上篇博客我們就全部學(xué)完了,接下來終于可以進(jìn)軍多線程的學(xué)習(xí)了,這點(diǎn)令我非常的激動(dòng),不然博客標(biāo)題都不知道怎么命名了,哈哈哈!正式進(jìn)入該篇博客的學(xué)習(xí),有關(guān)Linux系統(tǒng)下多線程的知識(shí)!
什么是可重入函數(shù)
可重入函數(shù)是一個(gè)新的概念,伴隨著可重入函數(shù),那么自然就有不可重入函數(shù),那么具體什么叫可重入函數(shù),什么叫不可重入函數(shù),需要我們進(jìn)行一定的鋪墊,才能搞清楚,首先由于該知識(shí)點(diǎn)是在信號(hào)相關(guān)知識(shí),并且與內(nèi)核態(tài)和用戶態(tài)之間發(fā)生進(jìn)程調(diào)度相關(guān),所以此時(shí)我們明白第一點(diǎn),就是當(dāng)一個(gè)進(jìn)程,時(shí)間片到了,就會(huì)發(fā)生進(jìn)程調(diào)度,也就是保存當(dāng)前進(jìn)程的上下文,替換下一個(gè)等待進(jìn)程,當(dāng)然進(jìn)程調(diào)度也就是讓用戶態(tài)進(jìn)程切換為內(nèi)核態(tài)進(jìn)程,而如果是進(jìn)行用戶態(tài)到內(nèi)核態(tài)進(jìn)程的切換,那么同時(shí)就會(huì)導(dǎo)致操作系統(tǒng)對(duì)該進(jìn)程進(jìn)行信號(hào)檢測(cè),此時(shí)就會(huì)發(fā)生信號(hào)遞達(dá)(默認(rèn)動(dòng)作,自定義動(dòng)作,忽略),按照該場(chǎng)景,此時(shí)就會(huì)產(chǎn)生一個(gè)非常細(xì)節(jié)的問題,如下圖所示:
同理,如圖所示,此時(shí)就可以發(fā)現(xiàn),如果在插入接口時(shí),發(fā)生了進(jìn)程調(diào)度,從而導(dǎo)致操作系統(tǒng)進(jìn)行信號(hào)檢測(cè),執(zhí)行對(duì)應(yīng)信號(hào)的自定義動(dòng)作,且剛好該動(dòng)作,也是一個(gè)插入動(dòng)作,那么就會(huì)導(dǎo)致上圖所示問題,也就是內(nèi)存泄露問題。顯然,該問題的存在是不合理的,并且該不合理現(xiàn)象是由于同一個(gè)函數(shù)被重復(fù)進(jìn)入導(dǎo)致,所以對(duì)于上述這種函數(shù),一但被重入就會(huì)導(dǎo)致一系列的問題,那么這種函數(shù)就被稱為不可重入函數(shù),反之稱為重入函數(shù),也就是同一個(gè)函數(shù)被重入,不會(huì)出現(xiàn)問題的函數(shù)。同理,明白了這點(diǎn)之后,什么是可重入函數(shù),什么是不可重入函數(shù),我們就搞定啦!并且一般常見的不可重入接口都在各種容器中,如上述的鏈表,當(dāng)然還有STL中各種容器的接口,還有malloc等!
理解volatile關(guān)鍵字
首先明白,這個(gè)關(guān)鍵字是C語言中的一個(gè)關(guān)鍵字,本質(zhì)就是為了告訴編譯器某個(gè)變量在程序執(zhí)行過程中可能會(huì)被修改,要進(jìn)行特殊處理,不能只是盲目的從CPU中的寄存器獲取該變量,而是要重新從內(nèi)存中獲取,具體是什么意思呢?想要搞懂這個(gè)關(guān)鍵字的概念,需要從下述代碼入手,如下:
從上圖中可以看出,使用了gcc編譯器中的優(yōu)化級(jí)別對(duì)比沒有使用gcc編譯器的優(yōu)化級(jí)別,兩者在代碼執(zhí)行結(jié)果方面,有很大的不同,并且從運(yùn)行結(jié)果來看,沒有使用gcc優(yōu)化,那么程序就會(huì)按照我們的預(yù)期,在收到了2號(hào)信號(hào)后,發(fā)生自定義動(dòng)作捕捉,然后將quit置1,緊接著返回繼續(xù)執(zhí)行代碼時(shí),退出死循環(huán),程序正常退出。而如果使用了gcc編譯器的優(yōu)化功能(-O2
),此時(shí)從運(yùn)行結(jié)果來看,無論是否收到2號(hào)信號(hào),那么程序都一直處于死循環(huán),本質(zhì)也就是當(dāng)該進(jìn)程收到2號(hào)信號(hào)后,執(zhí)行自定義動(dòng)作捕捉時(shí),quit全局變量并沒有由0置1,導(dǎo)致循環(huán)不會(huì)退出,那么此時(shí)問題就來了,為什么執(zhí)行了自定義動(dòng)作捕捉,也就是執(zhí)行了quit置1的代碼,循環(huán)不會(huì)終止呢?還有就是為什么只有使用了gcc優(yōu)化功能才會(huì)導(dǎo)致這個(gè)問題呢?具體如下圖所示:
從上圖有關(guān)代碼在硬件上的執(zhí)行過程,我們就發(fā)現(xiàn),本質(zhì)就是因?yàn)槭褂昧薕2的優(yōu)化級(jí)別,從而導(dǎo)致CPU在進(jìn)行計(jì)算時(shí),不直接從物理內(nèi)存中獲取相關(guān)變量的值,而是直接從寄存器中獲取先關(guān)變量的值,從而就會(huì)導(dǎo)致,因?yàn)樾盘?hào)執(zhí)行自定義動(dòng)作捕捉讓quit全局變量由0置1,單單只是讓物理內(nèi)存上的quit變量置1,而沒有讓CPU寄存器中的quit變量置1,從而導(dǎo)致quit置不變,程序持續(xù)死循環(huán),所以上述兩個(gè)問題,就非常容易回答,本質(zhì)就是因?yàn)槭褂昧薵cc的優(yōu)化功能,會(huì)導(dǎo)致CPU在計(jì)算時(shí),不直接從物理內(nèi)存中獲取數(shù)據(jù),而是直接從寄存器中獲取,所以也可以得出結(jié)論,gcc的優(yōu)化功能本質(zhì)就是在優(yōu)化物理內(nèi)存不斷加載數(shù)據(jù)到CPU寄存器中的這個(gè)過程,從而導(dǎo)致意料中改變的值,CPU接收不到。當(dāng)然注意:不是所有的代碼都能像上述一樣通過gcc的優(yōu)化功能進(jìn)行優(yōu)化,從而導(dǎo)致寄存器中的數(shù)據(jù)不會(huì)被物理內(nèi)存中的數(shù)據(jù)影響,只要像上述代碼中while(quit != 0);
這樣頻繁執(zhí)行同一結(jié)果的代碼,才有資格被優(yōu)化,也就是減少頻繁從物理內(nèi)存加載數(shù)據(jù)到CPU寄存器中,從而提高效率。明白了上述知識(shí)之后,無論是上述的現(xiàn)象還是問題,我們就都搞定了,當(dāng)然搞懂了上述問題和現(xiàn)象,volatile就不是什么重點(diǎn)了,同理上述所說,使用volatile就是在告訴編譯器,每次進(jìn)行計(jì)算時(shí),都要去物理內(nèi)存中獲取數(shù)據(jù)而已(保證內(nèi)存可見性)。所以當(dāng)我們使用了volatile關(guān)鍵字,上述因?yàn)間cc優(yōu)化功能導(dǎo)致死循環(huán)的問題就可以很好的被解決,如下圖所示:
切記:
使用gcc優(yōu)化的本質(zhì),還是在通過代碼控制具體的執(zhí)行方式,并且這個(gè)代碼是在生成匯編指令的時(shí)候添加進(jìn)去的,也就是我們的代碼因?yàn)閮?yōu)化變成了一套更復(fù)雜和高級(jí)的代碼,從而導(dǎo)致CPU在執(zhí)行該代碼時(shí),變成優(yōu)化形式執(zhí)行(也就是不從物理內(nèi)存中讀取數(shù)據(jù),而是從寄存器中讀?。?,所以CPU具體執(zhí)行代碼如下圖所示:
最終明白,在gcc中有許多的優(yōu)化級(jí)別,具體如下圖所示,這里不多過講解:
SIGCHLD信號(hào)
搞定了上述相關(guān)知識(shí),此時(shí)我們正式進(jìn)入信號(hào)有關(guān)知識(shí)的最后一個(gè)知識(shí)點(diǎn),與子進(jìn)程退出相關(guān)的信號(hào),在之前的學(xué)習(xí)中,我們學(xué)習(xí)了進(jìn)程創(chuàng)建,進(jìn)程等待等一系列知識(shí),明白子進(jìn)程需要被回收(父進(jìn)程等待),不然就會(huì)導(dǎo)致僵尸進(jìn)程等問題,并且父進(jìn)程在等待子進(jìn)程時(shí),有兩種方式,一種是阻塞式等待,一種是輪詢式等待(非阻塞式),從而導(dǎo)致父進(jìn)程想要成功的回收子進(jìn)程就一定要犧牲一定的效率,那么如何可以避免這個(gè)問題呢? 首先明白父進(jìn)程需要等待子進(jìn)程的本質(zhì)原因在于父進(jìn)程并不知道子進(jìn)程在干嘛,進(jìn)而不知道對(duì)應(yīng)子進(jìn)程在什么時(shí)候會(huì)退出導(dǎo)致。明白了這點(diǎn)之后,我們就可以將問題轉(zhuǎn)移為:子進(jìn)程在退出時(shí),是不是安安靜靜什么都不干,就默默的退出?答案肯定不是,那么子進(jìn)程在退出時(shí),會(huì)干什么呢?通過這個(gè)問題,我們就可以很好的引出該知識(shí)點(diǎn)的主角:SIGCHLD信號(hào),明白子進(jìn)程在退出時(shí),它會(huì)發(fā)送一個(gè)SIGCHLD信號(hào)給父進(jìn)程,但由于父進(jìn)程對(duì)于該信號(hào)的默認(rèn)處理動(dòng)作是忽略,所以在我們看來,子進(jìn)程退出時(shí)是默默無聞的退出,那么如何證明,子進(jìn)程確實(shí)會(huì)發(fā)送SIGCHLD信號(hào)呢?如下代碼所示:
整體代碼非常簡(jiǎn)單,就是在一個(gè)程序中創(chuàng)建一個(gè)子進(jìn)程,然后讓該子進(jìn)程退出的同時(shí),父進(jìn)程循環(huán)運(yùn)行(防止孤兒進(jìn)程),然后對(duì)SIGCHLD信號(hào)進(jìn)行捕捉,看父進(jìn)程是否會(huì)執(zhí)行對(duì)應(yīng)的自定義動(dòng)作,當(dāng)然,如果執(zhí)行了,那么就表示父進(jìn)程確實(shí)收到了子進(jìn)程退出時(shí),發(fā)送的SIGCHLD信號(hào),反之沒有??傊?,目前從上圖運(yùn)行結(jié)果可以看出,父進(jìn)程確實(shí)收到了SIGCHLD(17)信號(hào)。表明,子進(jìn)程在退出時(shí),確實(shí)不是默默無聞的退出,而是會(huì)發(fā)送SIGCHLD信號(hào)給父進(jìn)程。搞清楚了這點(diǎn)之后,接下來就是順?biāo)浦郏覀兯角傻木涂梢愿愣ㄓ嘘P(guān)SIGCHLD相關(guān)的知識(shí)啦!還是從子進(jìn)程退出時(shí)會(huì)發(fā)送一個(gè)信號(hào)給父進(jìn)程出發(fā),首先這樣就可以解決我們上述父進(jìn)程需要浪費(fèi)效率等待子進(jìn)程的問題,現(xiàn)在因?yàn)樽舆M(jìn)程會(huì)發(fā)送信號(hào)給父進(jìn)程,那么父進(jìn)程就不需要再浪費(fèi)資源去等待子進(jìn)程,而是等子進(jìn)程退出,發(fā)送SIGCHLD信號(hào)給父進(jìn)程時(shí),父進(jìn)程再去回收它,具體代碼如下所示:
如上代碼所示,我們?cè)诘茸舆M(jìn)程退出,父進(jìn)程接收到SIGCHLD信號(hào),執(zhí)行自定義捕捉動(dòng)作時(shí),在該自定義動(dòng)作中進(jìn)行子進(jìn)程回收,當(dāng)然也就是使用waitpid接口等待子進(jìn)程退出,并且明白如果等待成功,那么waitpid接口就會(huì)返回對(duì)應(yīng)被等待進(jìn)程的進(jìn)程pid,所以使用該方法到底能不能成功等待子進(jìn)程退出呢?如下圖運(yùn)行結(jié)果所示:
如圖可以發(fā)現(xiàn),最終waitpid的返回值和進(jìn)程的pid值是相同的,并且代碼執(zhí)行了3秒之后,由于父進(jìn)程沒有立即回收,而是等待了一秒才回收,所以子進(jìn)程在第四秒時(shí),是處于僵尸狀態(tài),而在第五秒,父進(jìn)程開始回收子進(jìn)程時(shí),子進(jìn)程才從僵尸狀態(tài)被父進(jìn)程回收,父進(jìn)程繼續(xù)運(yùn)行。
總而言之,上述通過子進(jìn)程退出,發(fā)送信號(hào)的方式,我們就可以讓父進(jìn)程不需要特意的去關(guān)心子進(jìn)程是否退出,所以當(dāng)我們的父進(jìn)程在需要執(zhí)行很多代碼的情況下,此時(shí)就可以使用上述方法,通過信號(hào)來回收子進(jìn)程。
但是當(dāng)我們使用信號(hào)的方式來回收子進(jìn)程,按照上述代碼來看就會(huì)存在一定的問題,當(dāng)然這個(gè)問題是存在于不同的情況下,也就是當(dāng)我有多個(gè)子進(jìn)程需要被回收的情況下,憑借以前學(xué)過有關(guān)信號(hào)處理的知識(shí),我們知道一個(gè)進(jìn)程的pending位圖只能記錄一次信號(hào),當(dāng)一個(gè)信號(hào)正在被執(zhí)行時(shí),該信號(hào)就會(huì)被添加到信號(hào)屏蔽字中(block位圖),那么就會(huì)導(dǎo)致父進(jìn)程不能同時(shí)處理多個(gè)子進(jìn)程發(fā)送過來的SIGCHLD信號(hào),那么此時(shí)就會(huì)導(dǎo)致某些子進(jìn)程的SIGCHLD信號(hào)被遺漏,從而導(dǎo)致某些子進(jìn)程不能被回收,最終造成僵尸進(jìn)程問題。所以為了解決該問題,我們需要將上述代碼進(jìn)行一定的升級(jí)處理,如下代碼所示:
注意:上述代碼有兩個(gè)知識(shí)點(diǎn),一是waitpid的第一個(gè)參數(shù)使用-1就可以在不需要指定進(jìn)程pid的情況下去等待任意進(jìn)程,二是在使用waitpid接口時(shí),第三個(gè)參數(shù)我們最好是使用WNOHANG參數(shù),表示非阻塞等待,也就是只等待退出進(jìn)程,不會(huì)等待未退出進(jìn)程,這樣可以使代碼更加安全。
注意:
除了之前學(xué)習(xí)的回收子進(jìn)程知識(shí)和今天學(xué)習(xí)的回收子進(jìn)程知識(shí),在Linux系統(tǒng)內(nèi)部還存在一種回收子進(jìn)程的方式,就是讓父進(jìn)程去調(diào)用sigaction或者signal接口將SIGCHLD信號(hào)的處理動(dòng)作設(shè)置為SIG_IGN(忽略),這樣fork出來的子進(jìn)程在進(jìn)程終止時(shí),也會(huì)自動(dòng)被操作系統(tǒng)清理,不會(huì)產(chǎn)生僵尸進(jìn)程,也不會(huì)通知父進(jìn)程。
線程基礎(chǔ)知識(shí)學(xué)習(xí)
該篇博客來到這里,上述有關(guān)可重入函數(shù),volatile和SIGCHLD信號(hào)相關(guān)知識(shí)就搞定啦!接下來正式進(jìn)入該篇博客的主題,有關(guān)線程相關(guān)知識(shí)的學(xué)習(xí),當(dāng)然由于線程相關(guān)知識(shí)非常的繁雜,所以一篇博客肯定是搞不定的,并且由于我們是剛開始學(xué)習(xí)線程相關(guān)知識(shí),所以肯定是由淺入深 ,先學(xué)習(xí)一下線程基礎(chǔ)知識(shí),大致了解一下線程的概念及其使用,具體如下所述:
Linux線程概念
什么是線程
首先明白操作系統(tǒng)相關(guān)的知識(shí)被稱為是計(jì)算機(jī)里的哲學(xué),就是那種讀一遍過去,你感覺,嗯,很有道理,但是卻不知道是什么意思,不知道怎么用,然后學(xué)了等于沒學(xué),哈哈哈!下述幾個(gè)就是經(jīng)典操作系統(tǒng)書籍中對(duì)線程的簡(jiǎn)單描述:
- 線程是一個(gè)執(zhí)行分支,執(zhí)行粒度比進(jìn)程更細(xì),調(diào)度成本更低
- 線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行流
- 線程是CPU調(diào)度的基本單位,進(jìn)程是承擔(dān)分配系統(tǒng)資源的基本實(shí)體
明白了上述操作系統(tǒng)中對(duì)線程的描述,也就是那幾句哲學(xué)一樣的語句,此時(shí)如何理解呢?下面我們就將這幾句話通過經(jīng)典的場(chǎng)景來分析,進(jìn)而搞懂這句話的深層含義,如下:
1.如何理解線程是一個(gè)執(zhí)行分支,執(zhí)行粒度比進(jìn)程更細(xì),調(diào)度成本更低
想要理解該知識(shí)點(diǎn),首先需要明白CPU中有兩類寄存器,一類是可見的,一類是不可見的,也就是有的寄存器是暴露給我們,允許我們使用的,有的寄存器是由CPU自己做管理,不提供給我們使用的,明白了這點(diǎn)之后,我們就可以來談?wù)劸€程相關(guān)的知識(shí)了,每個(gè)線程都具有獨(dú)立的執(zhí)行上下文和棧空間,而在線程在運(yùn)行時(shí),寄存器就為線程的上下文切換提供存儲(chǔ)環(huán)境,從而保證線程的運(yùn)行環(huán)境,如下圖所示:
從圖中可以看出,寄存器為進(jìn)程和線程的運(yùn)行提供了存儲(chǔ)環(huán)境,以便于CPU執(zhí)行相應(yīng)的代碼,而線程是根據(jù)進(jìn)程的pcb和操作系統(tǒng)中對(duì)應(yīng)的代碼創(chuàng)建出來的,并且對(duì)于進(jìn)程來說,線程的特點(diǎn)就是只有根據(jù)pcb創(chuàng)建出來的TCB,沒有對(duì)應(yīng)的虛擬地址空間,它們的虛擬地址空間是和進(jìn)程共用的。從而導(dǎo)致多個(gè)線程可以同時(shí)共享同一塊地址空間上的??臻g和代碼段,并且操作系統(tǒng)通過一些列的操作,可以將代碼段上的代碼分配給每一個(gè)線程去執(zhí)行(復(fù)雜),讓每一個(gè)線程都擁有自己的上下文和??臻g,所以可以將線程看做是進(jìn)程的一個(gè)執(zhí)行分支。按照上圖所示的話,那么該進(jìn)程此時(shí)就擁有了4個(gè)執(zhí)行分支,從而導(dǎo)致代碼的執(zhí)行效率大大提高。當(dāng)然執(zhí)行效率的提高雖然和執(zhí)行分支增多有一定關(guān)系,但是使用線程的好處遠(yuǎn)遠(yuǎn)不止于此,重點(diǎn)在于線程的執(zhí)行是并發(fā)執(zhí)行,具體如何并發(fā)執(zhí)行以及并發(fā)執(zhí)行等細(xì)節(jié)相關(guān)知識(shí),需要等我們深入學(xué)習(xí)之后再來詳談,此時(shí)我們只要知道,由于線程是并發(fā)執(zhí)行的,所以導(dǎo)致線程不僅可以共享同一塊地址空間,而且也可以共享同一個(gè)時(shí)間片,此時(shí)就會(huì)導(dǎo)致線程在調(diào)度時(shí),不需要像進(jìn)程調(diào)度時(shí)一樣,需要切換地址空間,更改映射關(guān)系等!而是直接使用同一地址空間,這樣就可以讓線程調(diào)度成本大大降低,當(dāng)然有關(guān)線程調(diào)度成本方面的問題,并不止于此,此處還涉及到一個(gè)CPU獲取數(shù)據(jù)時(shí)的局部性原理,下文慢慢談到。
2.如何理解線程是CPU調(diào)度的基本單位,進(jìn)程是承擔(dān)分配系統(tǒng)資源的基本實(shí)體
明白了上述有關(guān)線程的概念,那么進(jìn)程到底是什么呢?進(jìn)程也是一個(gè)線程嗎?這么理解肯定是不對(duì)的,因?yàn)榫€程是通過進(jìn)程創(chuàng)建的,它們之間的關(guān)系肯定不是對(duì)等的,而應(yīng)該是上下級(jí)。所以當(dāng)我們談到一個(gè)進(jìn)程時(shí),那么該進(jìn)程一定是需要包含對(duì)應(yīng)的執(zhí)行流(線程)、地址空間,頁表、物理內(nèi)存等,并且對(duì)于進(jìn)程的概念我們就需要進(jìn)行升級(jí),從之前的單執(zhí)行流,理解為包含一大推東西的一個(gè)實(shí)體,所以也就是將進(jìn)程理解為是承擔(dān)分配系統(tǒng)資源的基本實(shí)體(如上圖一般)。并且注意:同理時(shí)間片的分配,操作系統(tǒng)在分配系統(tǒng)資源時(shí)(內(nèi)存資源、CPU資源等),是以進(jìn)程為基本單位進(jìn)行分配,只有當(dāng)有了進(jìn)程之后,相當(dāng)于就是有了系統(tǒng)資源之后,我們才能根據(jù)進(jìn)程去創(chuàng)建線程,也就是讓線程去向進(jìn)程申請(qǐng)資源,當(dāng)然可以理解成是分配它的資源。同理如上圖所示,在CPU看來,它識(shí)別的要么就是一個(gè)單獨(dú)的進(jìn)程執(zhí)行流,要么就是該進(jìn)程中對(duì)應(yīng)的一個(gè)線程分支,而單獨(dú)的一個(gè)進(jìn)程執(zhí)行流在我們看來和一個(gè)線程沒有區(qū)別,所以對(duì)于CPU來說,調(diào)度的基本單位就是線程。
如何理解局部性原理
同理,首先明白,在CPU中不僅包括了上述所說的寄存器和之前所說的MMU(內(nèi)存管理單元),其中還包括了運(yùn)算器、控制器、高速緩存(cache L1,L2,L3)等!因?yàn)椴僮飨到y(tǒng)為了提高代碼的執(zhí)行效率,會(huì)將某些熱點(diǎn)數(shù)據(jù)先加載到緩存中,也就是當(dāng)我們?cè)趫?zhí)行某段代碼的時(shí)候,操作系統(tǒng)會(huì)將該代碼附近的代碼加載到緩存中,這樣就可以讓CPU上對(duì)應(yīng)PC指針等指向?qū)?yīng)執(zhí)行代碼的概率增大,從而提高代碼執(zhí)行效率,這就叫局部性原理。文章來源:http://www.zghlxwxcb.cn/news/detail-566905.html
總而言之,可以將線程理解為在一個(gè)進(jìn)程內(nèi)部獨(dú)立執(zhí)行的子執(zhí)行單元。一個(gè)進(jìn)程可以包含多個(gè)線程,每線程都有自己的執(zhí)行路徑和執(zhí)行上下文,和對(duì)應(yīng)的進(jìn)程共享系統(tǒng)資源,并且可以實(shí)現(xiàn)并發(fā)機(jī)制,極大提高代碼執(zhí)行效率和資源管理方式。文章來源地址http://www.zghlxwxcb.cn/news/detail-566905.html
總結(jié):由于時(shí)間關(guān)系,該篇博客就到這啦!線程相關(guān)知識(shí)我們算是開了個(gè)小頭,下篇博客更精彩哦!詳解頁表映射和線程的相關(guān)使用等知識(shí)!反正都是干貨,一起期待吧!
到了這里,關(guān)于學(xué)習(xí)系統(tǒng)編程N(yùn)o.28【多線程概念實(shí)戰(zhàn)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!