關於線程和進程的一些問題

關於線程和進程的一些問題

我在面試(C++面試)時被問到這些問題。我對答案沒有信心,想了解更多。

  1. 線程可以創建另一個線程嗎?
  2. 進程可以創建另一個進程嗎?
  3. 執行緒可以創建行程嗎?
  4. 進程可以創建執行緒嗎?

答案1

  1. 是的,一個執行緒可以建立另一個執行緒。在 UNIX 上,這是透過命令(在低級別)完成的clone(),而在高(更高)級別,則透過pthread庫在 C 編碼中完成。

  2. 是的,一個行程可以啟動另一個行程。這事兒常常發生。最常見的過程類型 -> 過程是透過fork()

  3. 這個,我不確定。這裡我想提一下線程有兩種主要類型:內核級線程和用戶級線程。內核級執行緒(通常)與主要進程相關聯,而用戶級執行緒則由這些進程產生(因此由內核級執行緒產生)。也有例外也許有人可以對線程 -> 進程給出更好的答案。

  4. 是的。參見3中的評論。

答案2

任何執行的程式碼都可以做任何事情。

也就是說,進程不是程式碼——執行緒是實際運行的東西,進程是它們的封閉環境。因此(1)和(3)為真,其餘為假。

答案3

全部同意。

它可能會幫助您了解進程實際上並不在 Windows 中「運行」。線程運行。每個行程至少有一個執行緒。所以,真正的問題是:

  • 執行程式碼可以創建另一個線程嗎?是的。

在 Windows 上,這是透過 CreateThread API 或其同類 API 之一完成的。長版本是“在線程上下文中運行的程式碼可以創建另一個線程嗎?”當然可以,但是自從全部程式碼在某個執行緒的上下文中運行,不需要額外的措詞。 CreateThread 接受一個參數,該參數是成為新線程的頂級函數的函數的地址 - 本質上是新線程的“main”。

  • 執行程式碼可以創建另一個進程嗎?是的。

與之前類似:當您在執行緒的上下文中運行時,您也在擁有該執行緒的進程的上下文中運行。所以,是的,有一個 CreateProcess API,您可以使用它來建立另一個進程。

您還將自動且無需進一步努力,在新進程中建立一個執行緒...因為(因為進程不運行)沒有執行緒的進程無法執行任何操作。新進程中的第一個執行緒將開始執行程式的「主」函數 - main() 或 WinMain() 或其他函數。

相關內容