2009-10-29 78 views
4

我正在写一个用户空间线程库。我有一个管理每个线程的结构。我的线程非常简单,它们接受一个函数ptr及其参数,并且只运行一次该函数。pthreads,setjmp,longjmp。如何知道函数何时完成运行?

每个线程都有一个jmp_buf,我使用setjmp和longjmp在线程间切换。我无法弄清楚的一件事是如何判断此功能何时完成。

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

  1. 我编辑PC并将其设置为函数指针,所以程序计数器接下来会出现在那里。
  2. 我也会让每个人都有自己的堆栈和编辑SP,使其指向该堆栈

所以用我的线程控制结构,我可以和线程之间进行切换各有一个保持状态,但不知道如何告诉该功能何时完成。当它结束时,我想调用一个特殊的exit()函数。

回答

2

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

0

它会尝试返回到最初被调用的位置 - 推测是您的create_thread函数。

2

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