2015-04-06 63 views
1

我想添加多线程的语言(BlitzBasic)不支持多线程或函数指针,而是从一个.dll获取函数指针

语言的编译器编译成某种形式的不支持运行功能的C被编译成本地代码。它仅限于Windows。

到目前为止,我的想法是在一个dll中创建一个函数,该函数将在BlitzBasic中调用。这个函数会检查调用堆栈以找出调用堆栈的位置。然后它会分叉一个新线程并返回。新线程将等待一段时间(10ms左右),然后在BlitzBasic中函数被调用的位置恢复执行。在BlitzBasic中,你将不得不根据该延迟来控制执行的其余部分(因此,第一个退出该函数的线程会设置一个变量,以告诉第二个线程执行一些不同的功能。)

我知道,多线程引入了很多其他的问题,但我会船到桥头当我到达那里。

有没有找到一个函数的调用堆栈的执行点的方法吗?

回答

1

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

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

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

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

1

这就好比setjmp and longjmp

你必须小心这些,因为正常清洁快速退出不会发生。

1

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

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