2009-10-28 21 views
0

所以即时通讯制作一个用户空间线程库。 让我们说一些使用它的程序。使用pthread制作用户空间线程库,您如何正确创建第一个线程? (第2个线程)

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

然后当第一个线程被创建时,库创建2个线程。一个用于'主要',另一个用于你正在制作的新游戏。这是并行运行的关键步骤。

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

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

我如何得到这个地址?

+0

嗨什么?希望你回答我。你能解释一下“这是一个指向函数的指针”是如何指向应该运行的下一行代码的吗?你是怎么做到的 ?非常感谢 – CHAPa 2010-05-21 14:41:40

+0

你可以用一个有意识的“坏”下标将它从堆栈中取出,但你将如何切换堆栈?有时候,这是可能的,没有组装,但是那样会更糟。 – DigitalRoss 2009-10-28 05:33:41

回答

1

这是平台特定的,通常基于一些CPU寄存器。如果内存正确地为我提供服务,通常在x86上使用理智的调用约定,这就像[ebp + 4]。但是,正如你可能知道的那样,这高度依赖于CPU和调用约定。例如,在PowerPC中,它被存储在一个名为“链接寄存器”的东西中......您可以使用内联asm获取类似的东西。

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

但要注意在像pthread_create()的接口,你在呼唤什么“主线程”是相当含蓄......该程序在创建一个新的线程,告诉它从一些特定的例程开始,而从那里返回的那个人就是你的情况中的“主线程”。你可能会发现这个模型比你的线程创建例程明确插入一些<eip, esp>(返回指令ptr,堆栈ptr)到某些线程列表中的头痛少一点...

相关问题