什麼是執行緒問題?


我們可以討論在設計多執行緒程式時需要考慮的一些問題。這些問題如下:

fork() 和 exec() 系統呼叫

fork() 用於建立副本程序。fork() 和 exec() 系統呼叫的含義在多執行緒程式中發生了變化。

如果程式中的一個執行緒呼叫了 fork(),新程序是否會複製所有執行緒,或者新程序是單執行緒的?例如,一些 UNIX 系統選擇使用兩種版本的 fork(),一種複製所有執行緒,另一種只複製呼叫 fork() 系統呼叫的執行緒。

如果執行緒呼叫 exec() 系統呼叫,則 exec() 引數中指定的程式將替換整個程序,包括所有執行緒。

訊號處理

通常,訊號用於 UNIX 系統中通知程序已發生特定事件。接收到的訊號可以是同步的或非同步的,具體取決於事件的來源和原因。

所有訊號,無論是同步的還是非同步的,都遵循以下相同模式:

  • 特定事件的發生會生成訊號。

  • 訊號傳遞給程序。

  • 一旦傳遞,必須處理訊號。

取消

執行緒取消是線上程完成之前終止執行緒的任務。

**例如**:如果多個數據庫執行緒併發地搜尋資料庫,並且一個執行緒返回結果,則其餘執行緒可能會被取消。

目標執行緒是要取消的執行緒,目標執行緒的取消可能發生在兩種不同的場景中:

  • **非同步取消**:一個執行緒立即終止目標執行緒。

  • **延遲取消**:目標執行緒定期檢查是否應終止,從而使其有機會以普通方式自行終止。

執行緒池

在 Web 伺服器中的多執行緒中,每當伺服器收到請求時,它都會建立一個單獨的執行緒來服務該請求。

建立執行緒時出現的一些問題如下:

  • 在服務請求之前建立執行緒所需的時間,以及一旦執行緒完成其工作就會被丟棄的事實。

  • 如果允許所有併發請求都在新執行緒中得到服務,則系統中併發活動執行緒的數量沒有限制。

  • 無限執行緒可能會耗盡系統資源,例如 CPU 時間或記憶體。

執行緒池是在程序啟動時建立一定數量的執行緒並將它們放入池中,在那裡它們處於空閒狀態並等待工作。

更新於:2021年11月30日

25K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告