从调用堆栈获取函数指针
Get Function Pointer from Call Stack
我想将多线程添加到不支持多线程或函数指针,但支持从.dll 运行函数的语言(BlitzBasic)中
该语言的编译器编译成某种形式的C,然后将其编译成本机代码。它仅适用于Windows。
到目前为止,我的想法是在dll中创建一个函数,该函数将从BlitzBasic中调用。此函数将检查调用堆栈,以找出调用它的位置。然后它会分叉一个新线程并返回。新线程将等待一小段时间(10ms左右),然后在BlitzBasic中调用函数的位置恢复执行。在BlitzBasic中,你必须根据延迟来控制其余的执行(因此,第一个退出该函数的线程将设置一个变量,告诉第二个线程执行一些不同的函数
我知道多线程会带来很多其他问题,但当我到达那里时,我会跨过这座桥。
有没有办法在调用堆栈中找到函数的执行点?
函数指针在此上下文中是不够的,因为函数指针只允许您从函数的开头调用函数,但您已经处于函数的中间。
您可以使用setjmp/longjmp,但除非在设计原始语言时考虑到线程安全,否则您可能会遇到很多问题。
特别是如果你的语言有任何全局状态,你将不得不围绕它创建锁
就我个人而言,我只会使用堆栈本身进行恢复,并拥有您的函数块,直到它准备好返回。您仍然可以生成一个新线程。这会容易得多。您也可以从一个更简单的协作线程模型开始,而不是从抢占开始。这会让你看看它是否可行。
这类似于setjmp
和longjmp
。
你必须小心这些,因为正常的出口清理不会发生。
您将不得不使用汇编语言。您需要一个汇编语言函数,它可以向上遍历一个堆栈堆栈框架。
通常帧指针寄存器指向当前堆栈帧。然后,您需要检查帧并定位保存的帧指针(例程调用方的指针)。帧指针通常指向返回时要执行的下一条指令的保存地址。
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针