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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

同一进程中的线程究竟共享哪些资源

發(fā)布時(shí)間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 同一进程中的线程究竟共享哪些资源 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

線程共享的環(huán)境包括:進(jìn)程代碼段、進(jìn)程的公有數(shù)據(jù)(利用這些共享的數(shù)據(jù),線程很容易的實(shí)現(xiàn)相互之間的通訊)、進(jìn)程打開的文件描述符、信號的處理器、進(jìn)程的當(dāng)前目錄和進(jìn)程用戶ID與進(jìn)程組ID。

? ??? 進(jìn)程擁有這許多共性的同時(shí),還擁有自己的個(gè)性。有了這些個(gè)性,線程才能實(shí)現(xiàn)并發(fā)性。這些個(gè)性包括:
??? 1.線程ID
????? 每個(gè)線程都有自己的線程ID,這個(gè)ID在本進(jìn)程中是唯一的。進(jìn)程用此來標(biāo)識線程。 ? ??? 2.寄存器組的值
?????? 由于線程間是并發(fā)運(yùn)行的,每個(gè)線程有自己不同的運(yùn)行線索,當(dāng)從一個(gè)線程切換到另一個(gè)線程上時(shí),必須將原有的線程的寄存器集合的狀態(tài)保存,以便 ?? 將來該線程在被重新切換到時(shí)能得以恢復(fù)。 ? ? 3.線程的堆棧 ? ? ? ?堆棧是保證線程獨(dú)立運(yùn)行所必須的。線程函數(shù)可以調(diào)用函數(shù),而被調(diào)用函數(shù)中又是可以層層嵌套的,所以線程?必須擁有自己的函數(shù)堆棧,使得函數(shù)調(diào)用可以正常執(zhí)行,不受其他線程的影響。
??? 4.錯(cuò)誤返回碼
?????? 由于同一個(gè)進(jìn)程中有很多個(gè)線程在同時(shí)運(yùn)行,可能某個(gè)線程進(jìn)行系統(tǒng)調(diào)用后設(shè)置了errno值,而在該線程還沒有處理這個(gè)錯(cuò)誤,另外一個(gè)線程就在此時(shí) ?? 被調(diào)度器投入運(yùn)行,這樣錯(cuò)誤值就有可能被修改。
?????? 所以,不同的線程應(yīng)該擁有自己的錯(cuò)誤返回碼變量。
??? 5.線程的信號屏蔽碼
?????? 由于每個(gè)線程所感興趣的信號不同,所以線程的信號屏蔽碼應(yīng)該由線程自己管理。但所有的線程都共享同樣的信號處理器。
??? 6.線程的優(yōu)先級
?????? 由于線程需要像進(jìn)程那樣能夠被調(diào)度,那么就必須要有可供調(diào)度使用的參?數(shù),這個(gè)參數(shù)就是線程的優(yōu)先級。

涉及多線程程序涉及的時(shí)候經(jīng)常會出現(xiàn)一些令人難以思議的事情,用堆和棧分配一個(gè)變量可能在以后的執(zhí)行中產(chǎn)生意想不到的結(jié)果,而這個(gè)結(jié)果的表現(xiàn)就是內(nèi)存的非法被訪問,導(dǎo)致內(nèi)存的內(nèi)容被更改。?

  理解這個(gè)現(xiàn)象的兩個(gè)基本概念是:在一個(gè)進(jìn)程的線程共享堆區(qū),而進(jìn)程中的線程各自維持自己堆棧。?

  另一運(yùn)行機(jī)制就是如果聲明一個(gè)成員變量如 char Name[200],隨著這段代碼調(diào)用的結(jié)束,Name在棧區(qū)的地址被釋放,而如果是 char * Name = new char[200]; 情況則完全不同,除非顯示調(diào)用delete否則 Name指向的地址不會被釋放。?

  在B中如果用棧區(qū) 即采用臨時(shí)變量的機(jī)制分配聲明V和堆區(qū),而者的結(jié)果是不同的。如果用棧區(qū),如果變量地址為Am1-Am2這么大,退出B調(diào)用時(shí)候這段地址被釋放,C函數(shù)可能將這段內(nèi)存改寫;這樣當(dāng)D執(zhí)行的時(shí)候,從內(nèi)存Am1-Am2中讀取的內(nèi)容就是被改過的了。?

  而如果用New(堆)分配,則不會出現(xiàn)那樣的情況,因?yàn)闆]有顯示對用delete并且堆對于線程共享,即2線程可以看到1線程在堆里分配的東西,所以不會發(fā)生誤寫。?

  這個(gè)問題是筆者在公司實(shí)習(xí)的時(shí)候發(fā)現(xiàn)的,因?yàn)楫?dāng)時(shí)剛剛涉及多線程程序設(shè)計(jì),操作系統(tǒng)中如此簡單的話題困擾筆者很久,希望可以對初涉C++多線程的讀者有所幫助! 2)如果兩個(gè)線程共享堆,而且都有可能執(zhí)行內(nèi)存分配和釋放操作,就必須進(jìn)行同步保護(hù),這個(gè)和C類,R類,T類沒有關(guān)系。你看到的例子兩個(gè)線程應(yīng)該是使用各自的堆。?

  在 windows 等平臺上,不同線程缺省使用同一個(gè)堆,所以用 C 的 malloc (或者 windows 的 GlobalAlloc)分配內(nèi)存的時(shí)候是使用了同步保護(hù)的。如果沒有同步保護(hù),在兩個(gè)線程同時(shí)執(zhí)行內(nèi)存操作的時(shí)候會產(chǎn)生競爭條件,可能導(dǎo)致堆內(nèi)內(nèi)存管理混亂。比如兩個(gè)線程分配了統(tǒng)一塊內(nèi)存地址,空閑鏈表指針錯(cuò)誤等。?

  Symbian 的線程一般使用獨(dú)立的堆空間。這樣每個(gè)線程可以直接在自己的堆里分配和釋放,可以減少同步所引入的開銷。當(dāng)線程退出的時(shí)候,系統(tǒng)直接回收線程的堆空間,線程內(nèi)沒有釋放的內(nèi)存空間也不會造成進(jìn)程內(nèi)的內(nèi)存泄漏。?

  但是兩個(gè)線程使用共用堆的時(shí)候,就必須用 critical section 或者 mutex 進(jìn)行同步保護(hù)。否則程序崩潰時(shí)早晚的事。如果你的線程需要在共用堆上無規(guī)則的分配和釋放任何數(shù)量和類型的對象,可以定制一個(gè)自己的 allcator,在 allocator 內(nèi)部使用同步保護(hù)。線程直接使用這個(gè) allocator 分配內(nèi)存就可以了。這相當(dāng)于實(shí)現(xiàn)自己的 malloc,free。但是更建議你重新審查一下自己的系統(tǒng),因?yàn)檫@種情況大多數(shù)是不必要的。經(jīng)過良好的設(shè)計(jì),線程的本地堆應(yīng)該能夠滿足大多數(shù)對象的需求。如果有某一類對象需要在共享堆上創(chuàng)建和共享,這種需求是比較合理的,可以在這個(gè)類的 new 和 delete 上實(shí)現(xiàn)共享保護(hù)。

?

轉(zhuǎn)自:http://laiyuanyuan7.blog.163.com/blog/static/15274321201241191321666

總結(jié)

以上是生活随笔為你收集整理的同一进程中的线程究竟共享哪些资源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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