pthreads,setjmp,longjmp。如何判断函数何时运行?

时间:2009-10-29 20:21:02

标签: c pthreads longjmp

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

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

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

  1. 我编辑电脑并将其设置为功能指针,然后程序计数器就转到那里。
  2. 我还让每个人都拥有自己的堆栈并编辑SP,因此它指向该堆栈
  3. 因此,使用我的线程控制结构,我可以在线程之间切换并让每个线程保持状态,但不知道如何判断该函数何时完成。当它完成后我想调用一个特殊的exit()函数。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

它会尝试返回原来调用的地方 - 大概是你的create_thread函数。