linux 携程库ucontext

 

在类System V的环境中,可以通过定义在<ucontext.h>头文件中的两个数据结构:mcontext_t 和 ucontext_t ,以及四个接口,getcontext(), setcontext(), makecontext(),  swapcontext(),来实现用户级别的上下文切换。

mcontext_t类型是机器相关的且不透明。 这ucontext_t类型是至少具有以下内容的结构 :

typedef struct ucontext_t {
               struct ucontext_t *uc_link;
               sigset_t          uc_sigmask;
               stack_t           uc_stack;
               mcontext_t        uc_mcontext;
               ...
           } ucontext_t;

在<signal.h>中定义了sigset_t和stack_t。 uc_link 指向当前 上下文终止时要运行的下一个上下文,uc_sigmask是屏蔽信号集 ,uc_stack是此对象使用的堆栈 上下文,而uc_mcontext是计算机上下文:器寄存器 。

#include <ucontext.h>
    int getcontext(ucontext_t* ucp);
    int setcontext(const ucontext_t* ucp);
    void makecontext(ucontext_t* ucp, void (*func)(), int argc, ...);
    int swapcontext(ucontext_t* olducp, ucontext_t* newucp);

int getcontext(ucontext_t * ucp);

  • 获取当前上下文, 初始化ucp结构体, 将当前上下文保存到ucp中
  • 成功返回0; 失败返回-1, 并设置errno

void makecontext(ucontext_t *ucp, void(*func)(), int argc, ...);

  • 创建一个目标上下文 创建方式: (1) getcontext, (2) 指定分配给上下文的栈uc_stack.ss_sp, (3) 指定这块栈的大小uc_stack.ss_size, (4) 指定uc_stack.ss_flags, (5) 指定后继上下文uc_link
  • 协程运行时使用主协程划分的栈空间,而协程切回主线程时需要将该部分栈空间的内容copy到每个协程各自的一个空间缓存起来,因为主协程中划分的栈空间并不是只用于一个协程,而是会用于多个协程
  • makecontext可以修改通过getcontext初始化得到的上下文, (必须先调用getcontext), 然后为ucp指定一个栈空间ucp->stack, 设置后继的上下文ucp->uc_link
  • 当上下文通过setcontext或者swapcontext激活后, 执行func函数(argc为后续的参数个数, 可变参数). 当func执行返回后, 继承的上下文被激活(ucp->uc_link), 如果为NULL, 则线程退出。

int setcontext(const ucontext_t *ucp)

  • 设置当前的上下文为ucp(激活ucp)
  • ucp来自getcontext, 那么上下文恢复至ucp
  • ucp来自makecontext, 那么将会调用makecontext函数的第二个参数指向的函数func, 如果func返回, 则恢复至ucp->uc_link指定的后继上下文, 如果该ucp中的uc_link为NULL, 那么线程退出
  • 成功不返回, 失败返回-1, 设置errno

int swapcontext(ucontext_t *oucp, ucontext_t *ucp)

  • 切换上下文
  • 保存当前上下文至oucp, 激活ucp上下文(先执行makecontext指定的ucp入口函数, 而后会执行ucp->uc_link指向的后继上下文)
  • 成功不返回, 失败返回-1, 设置errno

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值