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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++11中thread join和detach的区别

發(fā)布時(shí)間:2023/12/15 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++11中thread join和detach的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

線程狀態(tài):

在一個(gè)線程的生存期內(nèi),可以在多種狀態(tài)之間轉(zhuǎn)換,不同的操作系統(tǒng)可以實(shí)現(xiàn)不同的線程模型,定義許多不同的線程狀態(tài),每個(gè)狀態(tài)還可以包含多個(gè)子狀態(tài),但大體來說,如下幾種狀態(tài)是通用的:

1)就緒:參與調(diào)度,等待被執(zhí)行,一旦被調(diào)度選中,立即開始執(zhí)行

2)運(yùn)行:占用CPU,正在運(yùn)行中

3)休眠:暫不參與調(diào)度,等待特定事件發(fā)生

4)中止:已經(jīng)運(yùn)行完畢,等待回收線程資源

線程環(huán)境:

線程存在于進(jìn)程之中,進(jìn)程內(nèi)所有全局資源對于內(nèi)部每個(gè)線程都是可見的。

進(jìn)程內(nèi)典型全局資源如下:

1)代碼區(qū):這意味著當(dāng)前進(jìn)程空間內(nèi)所有的可見的函數(shù)代碼,對于每個(gè)線程來說,也是可見的

2)靜態(tài)存儲區(qū):全局變量,靜態(tài)空間

3)動態(tài)存儲區(qū):堆空間

線程內(nèi)典型的局部資源:

1)本地棧空間:存放本線程的函數(shù)調(diào)用棧,函數(shù)內(nèi)部的局部變量等

2)部分寄存器變量:線程下一步要執(zhí)行代碼的指針偏移量

一個(gè)進(jìn)程發(fā)起后,會首先生成一個(gè)缺省的線程,通常稱這個(gè)線程為主線程,C/C++程序中,主線程就是通過main函數(shù)進(jìn)入的線程,由主線程衍生的線程成為從線程,從線程也可以有自己的入口函數(shù),相當(dāng)于主線程的main函數(shù),這個(gè)函數(shù)由用戶指定。通過thread構(gòu)造函數(shù)中傳入函數(shù)指針實(shí)現(xiàn),在指定線程入口函數(shù)時(shí),也可以指定入口函數(shù)的參數(shù)。就像main函數(shù)有固定的格式要求一樣,線程的入口函數(shù)也可以有固定的格式要求,參數(shù)通常都是void類型,返回類型根據(jù)協(xié)議的不同也不同,pthread中是void,winapi中是unsigned int,而且都是全局函數(shù)。

最常見的線程模型中,除主線程較為特殊之外,其他線程一旦被創(chuàng)建,相互之間就是對等關(guān)系,不存在隱含的層次關(guān)系。每個(gè)進(jìn)程可創(chuàng)建的最大線程數(shù)由具體實(shí)現(xiàn)決定。

無論在windows中還是Posix中,主線程和子線程的默認(rèn)關(guān)系是:無論子線程執(zhí)行完畢與否,一旦主線程執(zhí)行完畢退出,所有子線程執(zhí)行都會終止。這時(shí)整個(gè)進(jìn)程結(jié)束或僵死,部分線程保持一種終止執(zhí)行但還未銷毀的狀態(tài),而進(jìn)程必須在其所有線程銷毀后銷毀,這時(shí)進(jìn)程處于僵死狀態(tài)。線程函數(shù)執(zhí)行完畢退出,或以其他非常方式終止,線程進(jìn)入終止態(tài),但是為線程分配的系統(tǒng)資源不一定釋放,可能在系統(tǒng)重啟之前,一直都不能釋放,終止態(tài)的線程,仍舊作為一個(gè)線程實(shí)體存在于操作系統(tǒng)中,什么時(shí)候銷毀,取決于線程屬性。在這種情況下,主線程和子線程通常定義以下兩種關(guān)系:

1、可會合(joinable):這種關(guān)系下,主線程需要明確執(zhí)行等待操作,在子線程結(jié)束后,主線程的等待操作執(zhí)行完畢,子線程和主線程會合,這時(shí)主線程繼續(xù)執(zhí)行等待操作之后的下一步操作。主線程必須會合可會合的子線程。在主線程的線程函數(shù)內(nèi)部調(diào)用子線程對象的wait函數(shù)實(shí)現(xiàn),即使子線程能夠在主線程之前執(zhí)行完畢,進(jìn)入終止態(tài),也必須執(zhí)行會合操作,否則,系統(tǒng)永遠(yuǎn)不會主動銷毀線程,分配給該線程的系統(tǒng)資源也永遠(yuǎn)不會釋放。

2、相分離(detached):表示子線程無需和主線程會合,也就是相分離的,這種情況下,子線程一旦進(jìn)入終止?fàn)顟B(tài),這種方式常用在線程數(shù)較多的情況下,有時(shí)讓主線程逐個(gè)等待子線程結(jié)束,或者讓主線程安排每個(gè)子線程結(jié)束的等待順序,是很困難或不可能的,所以在并發(fā)子線程較多的情況下,這種方式也會經(jīng)常使用。

在任何一個(gè)時(shí)間點(diǎn)上,線程是可結(jié)合(joinable)或者是可分離的(detached),一個(gè)可結(jié)合的線程能夠被其他線程回收資源和殺死,在被其他線程回收之前,它的存儲器資源如棧,是不釋放的,相反,一個(gè)分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時(shí)由系統(tǒng)自動釋放。

線程的分離狀態(tài)決定一個(gè)線程以什么樣的方式來終止自己,在默認(rèn)的情況下,線程是非分離狀態(tài)的,這種情況下,原有的線程等待創(chuàng)建的線程結(jié)束,只有當(dāng)pthread_join函數(shù)返回時(shí),創(chuàng)建的線程才算終止,釋放自己占用的系統(tǒng)資源,而分離線程沒有被其他的線程所等待,自己運(yùn)行結(jié)束了,線程也就終止了,馬上釋放系統(tǒng)資源。

轉(zhuǎn)自:c++11中thread join和detach的區(qū)別_Keep Moving~-CSDN博客_c++ detach

總結(jié)

以上是生活随笔為你收集整理的c++11中thread join和detach的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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