从调用堆栈中获取函数指针

Get Function Pointer from Call Stack

我想将多线程添加到不支持多线程或函数指针但支持来自 .dll运行 函数的语言 (BlitzBasic)

该语言的编译器编译成某种形式的 C,然后编译成本机代码。仅 Windows。

到目前为止,我的想法是在一个 dll 中创建一个可以从 BlitzBasic 中调用的函数。此函数将检查调用堆栈以找出调用它的位置。然后它将创建一个新线程和 return。新线程将等待一小会儿(10 毫秒左右),然后在 BlitzBasic 中调用函数的位置恢复执行。在 BlitzBasic 中,您必须根据该延迟控制其余的执行(因此第一个线程退出该函数将例如设置一个变量,告诉第二个线程执行一些不同的函数。

我知道多线程会带来很多其他问题,但当我到达那里时,我会跨过那座桥。

有没有办法在调用栈中找到函数的执行点?

这就像setjmp and longjmp

你必须小心这些,因为正常的退出时清理不会发生。

函数指针在此上下文中是不够的,因为函数指针只允许您从函数的开头调用函数,但您已经在函数的中间。

您可以使用 setjmp/longjmp,但除非原始语言在设计时考虑到线程安全,否则您可能会 运行 遇到很多问题。

特别是如果你的语言有任何全局状态,你将不得不围绕它创建锁。

就我个人而言,我只会使用堆栈本身来恢复并让您的功能块直到它准备好 return。您仍然可以生成一个新线程。这会容易很多。您还可以从更简单的协作线程模型开始,而不是从抢占开始。这会让你看看它是否有效。

您将不得不使用汇编语言。您将需要一种沿一个堆栈堆栈帧向上移动的汇编语言函数。

通常帧指针寄存器指向当前栈帧。然后您需要检查帧并找到保存的帧指针(例程调用者的指针)。帧指针通常指向下一条要执行的指令的保存地址 return.