(轉)同一進程中的線程究竟共享哪些資源

線程共享的環境包括:進程代碼段、進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通信)、進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。windows

 
    進程擁有這許多共性的同時,還擁有本身的個性。有了這些個性,線程才能實現併發性。這些個性包括:

    1.線程ID
      每一個線程都有本身的線程ID,這個ID在本進程中是惟一的。進程用此來標 識線程。
 
    2.寄存器組的值
       因爲線程間是併發運行的,每一個線程有本身不一樣的運行線索,當從一個線 程切換到另外一個線程上時,必須將原有的線程的寄存器集合的狀態保存,以便
   未來該線程在被從新切換到時能得以恢復。
 
    3.線程的堆棧
       堆棧是保證線程獨立運行所必須的。 線程函數能夠調用函數,而被調用函數中又是能夠層層嵌套的,因此線程  必須擁有本身的函數堆棧,使得函數調用能夠正常執行,不受其餘線程的影 響。

    4.錯誤返回碼
       因爲同一個進程中有不少個線程在同時運行,可能某個線程進行系統調用 後設置了errno值,而在該線程尚未處理這個錯誤,另一個線程就在此時
   被調度器投入運行,這樣錯誤值就有可能被修改。
       因此,不一樣的線程應該擁有本身的錯誤返回碼變量。

    5.線程的信號屏蔽碼
       因爲每一個線程所感興趣的信號不一樣,因此線程的信號屏蔽碼應該由線程自 己管理。但全部的線程都共享一樣的信號處理器。

    6.線程的優先級
       因爲線程須要像進程那樣可以被調度,那麼就必需要有可供調度使用的參  數,這個參數就是線程的優先級。

涉及多線程程序涉及的時候常常會出現一些使人難以思議的事情,用堆和棧分配一個變量可能在之後的執行中產生意想不到的結果,而這個結果的表現就是內存的非法被訪問,致使內存的內容被更改。 

  理解這個現象的兩個基本概念是:在一個進程的線程共享堆區,而進程中的線程各自維持本身堆棧。 

  另外一運行機制就是若是聲明一個成員變量如 char Name[200],隨着這段代碼調用的結束,Name在棧區的地址被釋放,而若是是 char * Name = new char[200]; 狀況則徹底不一樣,除非顯示調用delete不然 Name指向的地址不會被釋放。 

  在B中若是用棧區 即採用臨時變量的機制分配聲明V和堆區,而者的結果是不一樣的。若是用棧區,若是變量地址爲Am1-Am2這麼大,退出B調用時候這段地址被釋放,C函數可能將這段內存改寫;這樣當D執行的時候,從內存Am1-Am2中讀取的內容就是被改過的了。 

  而若是用New(堆)分配,則不會出現那樣的狀況,由於沒有顯示對用delete而且堆對於線程共享,即2線程能夠看到1線程在堆裏分配的東西,因此不會發生誤寫。 

  這個問題是筆者在公司實習的時候發現的,由於當時剛剛涉及多線程程序設計,操做系統中如此簡單的話題困擾筆者好久,但願能夠對初涉C++多線程的讀者有所幫助! 2)若是兩個線程共享堆,並且都有可能執行內存分配和釋放操做,就必須進行同步保護,這個和C類,R類,T類沒有關係。你看到的例子兩個線程應該是使用各自的堆。 

  在 windows 等平臺上,不一樣線程缺省使用同一個堆,因此用 C 的 malloc (或者 windows 的 GlobalAlloc)分配內存的時候是使用了同步保護的。若是沒有同步保護,在兩個線程同時執行內存操做的時候會產生競爭條件,可能致使堆內內存管理混亂。好比兩個線程分配了統一塊內存地址,空閒鏈表指針錯誤等。 

  Symbian 的線程通常使用獨立的堆空間。這樣每一個線程能夠直接在本身的堆裏分配和釋放,能夠減小同步所引入的開銷。當線程退出的時候,系統直接回收線程的堆空間,線程內沒有釋放的內存空間也不會形成進程內的內存泄漏。 

  可是兩個線程使用共用堆的時候,就必須用 critical section 或者 mutex 進行同步保護。不然程序崩潰時遲早的事。若是你的線程須要在共用堆上無規則的分配和釋聽任何數量和類型的對象,能夠定製一個本身的 allcator,在 allocator 內部使用同步保護。線程直接使用這個 allocator 分配內存就能夠了。這至關於實現本身的 malloc,free。可是更建議你從新審查一下本身的系統,由於這種狀況大多數是沒必要要的。通過良好的設計,線程的本地堆應該可以知足大多數對象的需求。若是有某一類對象須要在共享堆上建立和共享,這種需求是比較合理的,能夠在這個類的 new 和 delete 上實現共享保護。多線程

 

轉自:http://laiyuanyuan7.blog.163.com/blog/static/15274321201241191321666併發

相關文章
相關標籤/搜索