ucontext函数簇提供了4个函数用于控制用户态的上下文。利用这几个函数可以实现一个协程。
ucontext_t结构体1
2
3
4
5
6
7typedef struct {
ucontext_t *uc_link; //当前上下文结束后要恢复到时的上下文,
sigset_t uc_sigmask; //上下文要阻塞的信号集合
stack_t uc_stack; //上下文所使用的栈
mcontext_t uc_mcontext; //机器特定的保护上下文的表示,包括协程的机器寄存器
...
} ucontext_t;
1 |
|
1 |
|
每隔一秒打印一行Hello world
。
1 |
|
先打印Hello world
,然后打印foo
。
1 |
|
swapcontext(&ctx[0], &ctx[2])
切换到ctx[2]上下文,此时将执行f2
。打印start f2,然后切换上下文到ctx[1];执行f1函数,打印start f1;切换到f2
,打印finish f2;f2
执行完成后,因为ctx[2].uc_link=&ctx[1]
,再次进入ctx[1],打印出finish f1。
输出1
2
3
4start f2
start f1
finish f2
finish f1
Ref:
1.http://walkerdu.com/2017/01/09/ucontext-theory/
2.Complete Context Control
3.https://zhengyinyong.com/post/ucontext-usage-and-coroutine/