簡體   English   中英

使用pthread制作用戶空間線程庫,如何正確創建第一個線程? (以及前2個線程)

[英]Making a user space thread library with pthread, how do you properly create the first thread? (well first 2 threads)

因此,即時通訊使用戶空間線程庫。 可以說有一些使用它的程序。

在該程序中,它從main方法開始。 在對create_thread的任何調用之前,沒有活動的線程。

然后,當創建第一個線程時,該庫將創建2個線程。 一種用於“主要”,一種用於實際制作的新主題。 這是並行運行的關鍵步驟。

我要做的一件事是在我創建的每個線程對象中分配一個指針,該指針指向線程啟動時應運行的下一行代碼。 對於我創建的線程來說,這很容易,它是該函數的指針。

對於“主”線程,它應指向創建后main中的下一行代碼。

我如何獲得這個地址?

這是特定於平台的,通常基於某些CPU寄存器。 如果內存正確地為我服務,通常在x86上使用合理的調用約定,則類似於[ebp + 4] 但是,您可能會說,這高度依賴於CPU和調用約定。 例如,在PowerPC中,它存儲在稱為“鏈接寄存器”的東西中。您可以使用內聯asm獲得類似的信息。

請記住,您還必須將堆棧恢復到原來的狀態。線程的用戶空間(或內核)實現通常將為每個上下文以及何時進行上下文切換存儲堆棧指針。您可以執行x86指令pushad (將所有寄存器保存到堆棧)和交換堆棧指針並恢復所需的任何其他狀態。 然后,您執行諸如popad然后跳回到以前的位置。 (也許使用ret指令;在中斷例程中將被iretd

但是請注意,在類似pthread_create()的接口中,您所說的“主線程”是相當隱含的……該例程創建了一個新線程,並告訴它從某個特定例程開始,而從該線程返回的家伙是“主線程”。 您可能會發現,與讓線程創建例程將帶有<eip, esp> (返回指令ptr,堆棧ptr)的內容顯式地插入某些線程列表相比,該模型更令人頭疼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM