使用pthread创建用户空间线程库,如何正确创建第一个线程? (先前2个主题)

时间:2009-10-28 03:52:30

标签: c linux-kernel pthreads

所以我正在创建一个用户空间线程库。 让我们说一些使用它的程序。

在该程序中,它从main方法开始。在任何调用create_thread之前,没有活动的线程。

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

我需要做的一件事就是在每个线程对象中分配一个指针,指向应该在线程启动时运行的下一行代码。对于我创建的线程,这很容易,它是指向函数的指针。

对于'main'线程,这应该指向create之后的main中的下一行代码。

我如何获得此地址?

1 个答案:

答案 0 :(得分:1)

这是特定于平台的,通常基于某些CPU寄存器。如果内存正确地为我服务,通常在具有健全调用约定的x86上,这就像[ebp + 4]。但正如您可能能够说的那样,这高度依赖于CPU和调用约定。例如,在PowerPC中,它存储在称为“链接寄存器”的东西中......你可以使用内联asm来获取这样的东西。

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

但请注意,在pthread_create()之类的接口中,你所谓的“主线程”是相当隐含的......该例程创建了一个新线程并告诉它从某个特定例程开始,然后返回从那是你的情况下的“主线程”。您可能会发现该模型比让您的线程创建例程明确地将<eip, esp>(返回指令ptr,stack ptr)插入到某个线程列表中的内容更令人头疼......