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

时间:2015-04-06 15:25:33

标签: c++ windows function-pointers

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

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

到目前为止,我的想法是在一个可以在BlitzBasic中调用的dll中创建一个函数。此函数将检查调用堆栈以找出它的调用位置。然后它将分叉一个新线程并返回。新线程将等待一会儿(大约10ms),然后在BlitzBasic中调用函数的位置继续执行。在BlitzBasic中,你必须根据该延迟来控制执行的其余部分(因此第一个离开该函数的线程将设置一个变量,它将告诉第二个线程执行某些不同的函数。

我知道多线程会引入很多其他问题,但是当我到达那里时,我会越过那座桥。

有没有办法在callstack中找到函数的执行点?

3 个答案:

答案 0 :(得分:1)

这就像setjmp and longjmp

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

答案 1 :(得分:1)

在这种情况下,函数指针是不够的,因为函数指针只允许你从头开始调用函数,但是你已经处于函数的中间。

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

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

就个人而言,我只是使用堆栈本身进行恢复,并让你的功能块直到它准备好返回。你仍然可以产生一个新的线程。这将更容易。您也可以从更简单的协作线程模型开始,而不是从抢占开始。这将让你看看它是否会起作用。

答案 2 :(得分:1)

您将不得不使用汇编语言。您需要一个汇编语言语言函数,它可以向上移动一个堆栈帧。

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

相关问题