哪里有上下文切换的例子

时间:2011-04-29 09:25:25

标签: c pthreads

假设指向A的函数指针传递给pthread_create 并且在线程运行之后,我将函数指针的地址从A

更改为静态函数B.

我不明白一个线程如何通过push和pop在两个函数A和B之间切换 因为我想在中断它的线程时保存函数A的上下文

显示此上下文切换的任何示例

1 个答案:

答案 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()

真正的实现需要处理更多细节,但原则上,这就是线程上下文切换的全部内容 - 它实际上只是意味着切换堆栈。