同一進程中的線程可以共享哪些資源

1.用堆和棧分配一個變量可能在以後的執行中產生意想不到的結果,而這個結果的表現就是內存的非法被訪問,導致內存的內容被修改。

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

如果聲明一個成員變量,如char name[200],隨着這段代碼調用的結束,name在棧區的地址會被釋放。而如果是char* name = new char[200];情況完全不同,除非顯式調用delete,否者name指向的地址不會被釋放。

在程序B中如果用棧區即採用臨時變量的機制分配聲明V和堆區,兩者的結果是不同。如果用棧區,如果變量地址爲Am1-Am2這麼大,退出B調用時候這段地址會被釋放,C函數可能將這段內存進行改寫;這樣當程序D執行的時候,從內存Am1-Am2中讀取的內容就是被改過的了。而如果用New(堆)分配,則不會出現那樣的情況,因爲沒有顯式調用delete並且堆對於線程共享,即線程2可以看到線程1在堆裏分配的東西,所以不會發生改寫。

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

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

  a.線程ID

        每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標識線程。

  b.線程的堆棧

        堆棧是保證線程獨立運行所必須的。線程函數可以調用函數,而被調用函數中又是可以層層嵌套的,所以線程必須擁有自己的函數堆棧,使得函數調用可以正常執行,不受其他線程的影響。

 c.錯誤返回碼

        不同的線程應該擁有自己的錯誤返回碼變量。

 d.線程的信號屏蔽嗎

         由於每個線程所感興趣的信號不同,所以線程的信號屏蔽嗎應該由線程自己管理。但所有的線程都共享同樣的信號處理器。

 e.線程的優先級

         由於線程需要像進程那樣能夠被調度,那麼就必須要有可供調度使用的參數,這個參數就是線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章