假设指向A的函数指针传递给pthread_create 并且在线程运行之后,我将函数指针的地址从A
更改为静态函数B.我不明白一个线程如何通过push和pop在两个函数A和B之间切换 因为我想在中断它的线程时保存函数A的上下文
显示此上下文切换的任何示例
答案 0 :(得分:0)
很难说出你在这里问的是什么......但我会试一试。
为了解决你的第一段,我想你要问的是当你将一个函数指针(指向函数A()
)传递给pthread_create()
时会发生什么,然后将函数指针修改为指向不同的函数(函数B()
)。答案是修改函数指针对正在运行的线程没有影响;因为您将函数指针的副本传递给pthread_create()
,所以正在运行的线程将不会检测到您稍后修改了函数指针。
我相信你真的在追求其他东西,但是:如何实现线程上下文切换?让我们假设您正在进行协作式多任务处理,即正在运行的线程明确需要通过调用yield()
函数来产生CPU。这是一个简单的yield函数可能是什么样的伪代码;我们将调用当前运行的线程“线程A”和我们正在切换“线程B”的线程:
void yield()
{
Save all registers to the stack
Save current stack pointer in some data structure dedicated to thread A
Choose a different thread to yield to (in our case, this is thread B)
Change stack pointer to the stack pointer that was saved for thread B
Restore registers
}
没错,线程上下文切换本质上只是意味着将堆栈指针切换到不同的堆栈。这样做的关键效果是,当线程A调用yield()
时,堆栈上的返回地址现在不再是堆栈上的返回地址。相反,返回地址是线程B最后一次 it 调用yield()
时放在堆栈上的地址。因此,当yield()
返回时,它返回到线程B最后一次控制CPU的位置。
非常时髦,是吧?让你的头缠绕它需要一点时间。
如果你想将这种协同多任务扩展到抢占式多任务处理,那么你原则上要做的就是创建一个由定时器定期调用的中断;该中断的中断服务程序只是yield()
。
真正的实现需要处理更多细节,但原则上,这就是线程上下文切换的全部内容 - 它实际上只是意味着切换堆栈。