我正在使用ucontext_t
实现一个用户级线程库。我通过uc_link
将线程链接到调度程序线程,但是,在某些情况下,我们需要获得返回值。我不知道如何获得返回值,因为上下文是分开的。我能想到的访问返回值的唯一方法是以某种方式进入该上下文的堆栈,找到返回值的位置。然而,这似乎是一个灾难和奇怪错误的公式。
在ucontext终止时从中获取返回值
由ucontext_t
表示的执行上下文没有返回值。这在入口点函数终止时的行为中是隐含的(后续上下文(如果有的话(被激活(,在入口点功能的签名中是显式的(它返回void
(。
还要注意的是,入口点函数必须是非可变的,这与makecontext()
本身不同,尽管它可以接受任何固定数量的参数。makecontext
的调用方有义务指定正确的参数计数和那么多int
参数。
如果你想在上下文之间通信数据,那么你应该把它或指向它的指针写在某个共享内存位置,稍后你可以在不同的上下文中从中检索它。在这种情况下,它可能在lib为每个线程维护的元数据中。
如果有问题的数据是某个函数的返回值,那么该函数就不能成为上下文的入口点。在这种情况下(以及出于其他原因(,您可能希望避免使用用户提供的函数作为ucontext入口点。相反,使用库内部提供的函数,该函数知道如何引导到用户函数以及返回时该做什么。