在C中,可以使用setjmp()和longjmp()对光纤进行编码,以在用户级实现上下文切换。如中所述evanjones.ca和Portable Multithreading(pdf)还要求每根光纤都有……
首先,线程不是为了手动控制自己的调度。也就是说,线程并不打算决定结束或暂停其执行并启动另一个线程。相反,线程可以同时运行,并且系统可以同时在不同的物理或虚拟处理器上运行多个线程,或者可以启动和停止线程,以便它们共享处理器上的可用时间。
因为线程可以同时运行,所以它们必须具有单独的堆栈。每个线程都会在其他线程改变并使用它们的同时改变并使用自己的堆栈。这些堆栈必须分开以避免冲突。
第二, setjmp 和 longjmp 不适合跳转到线程状态的任意点。程序可以使用 longjmp 只回到以前 setjmp 在其当前的调用堆栈中,在同一个线程中。例如,你不能做一些工作,记住状态 A 同 setjmp ,做更多的工作,记住状态 B 同 setjmp , 然后 longjmp 陈述 A , 然后 longjmp 陈述 B 。之后 longjmp 至 A , B 已经不再可用了 setjmp 不再有效。
setjmp
longjmp
A
B
假设光纤具有调用另一个功能的功能,该功能调用另一个功能,然后该功能将该光纤切换为另一个光纤。当我们恢复这条光纤时,我们需要确保所有局部变量都恢复到光纤切换时的状态,我们需要确保从该函数返回的函数返回到调用函数。 因此出现以下规则:
紧接着这两条规则,每条光纤都必须有自己的堆栈。