我正在编写用户空间线程库。我有一个管理每个线程的结构。我的线程非常简单,它们使用函数ptr及其参数,并且只运行一次该函数。
每个线程都有一个jmp_buf,我使用setjmp和longjmp在线程之间切换。我无法弄清楚的一件事是如何判断这个功能何时完成。
对于每个线程,我以两种方式修改jmpbuf。
因此,使用我的线程控制结构,我可以在线程之间切换并让每个线程保持状态,但不知道如何判断该函数何时完成。当它完成后我想调用一个特殊的exit()函数。
答案 0 :(得分:2)
您可以修改堆栈上的返回地址以指向exit()函数,或者将函数调用包装在另一个调用exit()之后的函数中。
答案 1 :(得分:2)
不应该将PC修改为用户函数,而应该实际调用一些特殊函数(让我们称之为run_thread()
)分支到该线程的入口函数。当该入口函数返回时(即,线程已退出),run_thread()
应该执行任何指示此线程完成所需的工作(可能通过从调度列表中删除该线程控制块并将其添加到join()清理列表)。然后它可以产生,当父对其ID调用join()时,它将被清除。
答案 2 :(得分:0)
它会尝试返回原来调用的地方 - 大概是你的create_thread
函数。