gpt4 book ai didi

c - 用pthread制作用户空间线程库,如何正确创建第一个线程? (前 2 个线程)

转载 作者:行者123 更新时间:2023-11-30 16:05:14 25 4
gpt4 key购买 nike

所以我正在制作一个用户空间线程库。假设有一些程序使用它。

在该程序中,它从 main 方法开始。在调用任何 create_thread 之前,没有任何线程处于事件状态。

然后,当创建第一个线程时,库会创建 2 个线程。一个用于“主要”,另一个用于您正在制作的实际新主题。这是并行运行的关键步骤。

要完成这项工作,我需要做的一件事是在我创建的每个线程对象中分配一个指针,指向线程启动时应运行的下一行代码。对于我创建的线程来说这很简单,它是一个指向函数的指针。

对于“主”线程,这应该指向创建后 main 中的下一行代码。

我如何获得这个地址?

最佳答案

这是特定于平台的,通常基于某些 CPU 寄存器。如果我没记错的话,通常在具有合理调用约定的 x86 上,类似于 [ebp + 4] 。但正如您可能知道的那样,这高度依赖于 CPU 和调用约定。例如,在 PowerPC 中,它存储在称为“链接寄存器”的东西中...您可以使用内联汇编获得类似的东西。

请记住,您还必须将堆栈恢复到原来的位置...线程的用户空间(或内核)实现通常会为每个上下文存储一个堆栈指针,并且在适当的时候要进行上下文切换,您可以执行类似 x86 指令 pushad 的操作(将所有寄存器保存到堆栈)并交换堆栈指针并恢复您需要的任何其他状态。然后你做类似 popad 的事情然后跳回到之前的位置。 (也许使用 ret 指令;在中断例程中,这将是 iretd )

但请注意像 pthread_create() 这样的界面,你所说的“主线程”是相当隐含的......该例程创建一个新线程并告诉它从某个特定例程开始,而从该例程返回的人就是你的情况下的“主线程”。您可能会发现该模型比让您的线程创建例程显式插入带有 <eip, esp> 的内容要简单一些。 (返回指令 ptr,堆栈 ptr)到一些线程列表中...

关于c - 用pthread制作用户空间线程库,如何正确创建第一个线程? (前 2 个线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com