4

我正在编写一个用户空间线程库。我有一个管理每个线程的结构。我的线程非常简单,它们接受一个函数 ptr 及其参数,然后只运行一次该函数。

每个线程都有一个 jmp_buf,我使用 setjmp 和 longjmp 在线程之间切换。我不知道的一件事是如何判断此功能何时完成。

对于每个线程,我以两种方式修改 jmpbuf。

  1. 我编辑 PC 并将其设置为函数指针,因此程序计数器接下来会转到那里。
  2. 我还让每个人都有自己的堆栈并编辑 SP 使其指向该堆栈

因此,使用我的线程控制结构,我可以在线程之间切换并让每个线程保持状态,但不知道如何判断该功能何时完成。完成后,我想调用我拥有的特殊 exit() 函数。

4

3 回答 3

2

而不是将您的 PC 修改为用户函数,您实际上应该调用一些特殊的函数(让我们称之为它run_thread()),它分支到该线程的入口函数。当该入口函数返回(即线程已退出)时,run_thread()应执行指示该线程已完成所需的任何工作(可能通过从调度列表中删除该线程控制块并将其添加到 join() 清理列表)。然后它可以产生,并且当父级在其 ID 上调用 join() 时,它将被清理。

于 2009-10-29T20:41:00.063 回答
2

您可以修改堆栈上的返回地址以指向您的 exit() 函数,或者将函数调用包装在另一个调用 exit() 的函数中。

于 2009-10-29T20:26:27.497 回答
0

它会尝试返回到最初调用它的地方——大概是你的create_thread函数。

于 2009-10-29T20:26:37.200 回答