1. 程式人生 > >多執行緒共享資源

多執行緒共享資源

多執行緒共享資源

按照作業系統原理,程序是系統資源分配的最小單位,執行緒是cpu排程的最小單位。執行緒共享程序申請的資源,但是執行緒有維持自己正常執行的很小的資源,這很小的資源為各個執行緒獨有。

同一個程序中建立的多執行緒共享的環境包括:

  • 程序程式碼段
  • 程序的公有資料(利用這些共享資料,執行緒很容易實現相互之間的通訊)
  • 程序開啟的檔案描述符
  • 訊號的處理器
  • 程序的當前目錄
  • 程序使用者ID
  • 程序組ID

程序擁有這麼多共性的同時,還擁有自己的個性。有了這些個性,執行緒才能實現併發性。這些個性包括:

  1. 執行緒ID

    每個執行緒都有自己的執行緒ID,這個ID在本程序中是唯一的。程序用此來標識執行緒。

  2. 暫存器組的值

    由於執行緒間是併發執行的,每個執行緒有自己不同的執行線索。當從一個執行緒切換到另一個執行緒上時,必須將原有的執行緒的暫存器集合的狀態儲存,以便將來該執行緒在被重新切換到時能得以恢復。

  3. 執行緒的堆疊

    堆疊是保證執行緒獨立執行所必須的。

    執行緒函式可以呼叫函式,而被呼叫函式中又是可以層層巢狀的,所以執行緒必須擁有自己的函式堆疊,使得函式呼叫可以正常執行,不受其他執行緒的影響。

  4. 錯誤返回碼

    由於同一個程序中有很多個執行緒在同時執行,可能某個執行緒進行系統呼叫後設置了errno值,而在該執行緒還沒有處理這個錯誤,另外一個執行緒就在此時被排程器投入執行,這樣錯誤值就有可能被修改。

    所以,不同的執行緒應該擁有自己的錯誤返回碼變數。

  5. 執行緒的訊號遮蔽碼

    由於執行緒所感興趣的訊號不同,所以執行緒的訊號遮蔽碼應該由執行緒自己管理。但所有的執行緒都共享同樣的訊號處理器。

  6. 執行緒的優先順序

    由於執行緒需要像程序那樣能夠被排程,那麼就必須要有可供排程使用的引數,這個引數就是執行緒的優先順序。