線程之間共享的資源有哪些


同一進程間的線程究竟共享哪些資源呢,而又各自獨享哪些資源呢?

共享的資源有:
a. 堆  由於堆是在進程空間中開辟出來的,所以它是理所當然地被共享的;因此new出來的都是共享的(16位平台上分全局堆和局部堆,局部堆是獨享的)
b. 全局變量 它是與具體某一函數無關的,所以也與特定線程無關;因此也是共享的
c. 靜態變量 雖然對於局部變量來說,它在代碼中是“放”在某一函數中的,但是其存放位置和全局變量一樣,存於堆中開辟的.bss和.data段,是共享的
d. 文件等公用資源  這個是共享的,使用這些公共資源的線程必須同步。Win32 提供了幾種同步資源的方式,包括信號、臨界區、事件和互斥體。
獨享的資源有
a. 棧 棧是獨享的
b. 寄存器  這個可能會誤解,因為電腦的寄存器是物理的,每個線程去取值難道不一樣嗎?其實線程里存放的是副本,包括程序計數器PC
 
線程共享的環境包括:
進程代碼段、進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊)、進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。
 
進程擁有這許多共性的同時,還擁有自己的個性。有了這些個性,線程才能實現並發性。
這些個性包括:
1.線程ID
  每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標識線程。
 
2.寄存器組的值
  由於線程間是並發運行的,每個線程有自己不同的運行線索,當從一個線 程切換到另一個線程上 時,必須將原有的線程的寄存器集合的狀態保存,以便將來該線程在被重新切換到時能得以恢復。
 
3.線程的堆棧
  堆棧是保證線程獨立運行所必須的。線程函數可以調用函數,而被調用函數中又是可以層層嵌套的,所以線程必須擁有自己的函數堆棧, 使得函數調用可以正常執行,不受其他線程的影響。
 
4.錯誤返回碼
      由於同一個進程中有很多個線程在同時運行,可能某個線程進行系統調用 后設置了errno值,而在該 線程還沒有處理這個錯誤,另外一個線程就在此時被調度器投入運行,這樣錯誤值就有可能被修改。所以不同線程應該有自己的錯誤返回碼變量。
 
5.線程的信號屏蔽碼
  由於每個線程所感興趣的信號不同,所以線程的信號屏蔽碼應該由線程自己管理。但所有的線程都 共享同樣的信號處理器。

6.線程的優先級
  由於線程需要像進程那樣能夠被調度,那么就必須要有可供調度使用的參數,這個參數就是線程的 優先級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM