什麼是執行緒問題?
我們可以討論在設計多執行緒程式時需要考慮的一些問題。這些問題如下:
fork() 和 exec() 系統呼叫
fork() 用於建立副本程序。fork() 和 exec() 系統呼叫的含義在多執行緒程式中發生了變化。
如果程式中的一個執行緒呼叫了 fork(),新程序是否會複製所有執行緒,或者新程序是單執行緒的?例如,一些 UNIX 系統選擇使用兩種版本的 fork(),一種複製所有執行緒,另一種只複製呼叫 fork() 系統呼叫的執行緒。
如果執行緒呼叫 exec() 系統呼叫,則 exec() 引數中指定的程式將替換整個程序,包括所有執行緒。
訊號處理
通常,訊號用於 UNIX 系統中通知程序已發生特定事件。接收到的訊號可以是同步的或非同步的,具體取決於事件的來源和原因。
所有訊號,無論是同步的還是非同步的,都遵循以下相同模式:
特定事件的發生會生成訊號。
訊號傳遞給程序。
一旦傳遞,必須處理訊號。
取消
執行緒取消是線上程完成之前終止執行緒的任務。
**例如**:如果多個數據庫執行緒併發地搜尋資料庫,並且一個執行緒返回結果,則其餘執行緒可能會被取消。
目標執行緒是要取消的執行緒,目標執行緒的取消可能發生在兩種不同的場景中:
**非同步取消**:一個執行緒立即終止目標執行緒。
**延遲取消**:目標執行緒定期檢查是否應終止,從而使其有機會以普通方式自行終止。
執行緒池
在 Web 伺服器中的多執行緒中,每當伺服器收到請求時,它都會建立一個單獨的執行緒來服務該請求。
建立執行緒時出現的一些問題如下:
在服務請求之前建立執行緒所需的時間,以及一旦執行緒完成其工作就會被丟棄的事實。
如果允許所有併發請求都在新執行緒中得到服務,則系統中併發活動執行緒的數量沒有限制。
無限執行緒可能會耗盡系統資源,例如 CPU 時間或記憶體。
執行緒池是在程序啟動時建立一定數量的執行緒並將它們放入池中,在那裡它們處於空閒狀態並等待工作。