在C/C++中,可以使用
#include <stdio.h>
#include <ucontext.h>
#define STACK_SIZE 8192
ucontext_t ctx[3];
void coroutine_func(int id) {
for (int i = 0; i < 5; i++) {
printf("Coroutine %d: %d\n", id, i);
swapcontext(&ctx[id], &ctx[(id + 1) % 3]);
}
}
int main() {
char stack[3][STACK_SIZE];
// 初始化三个协程的上下文
for (int i = 0; i < 3; i++) {
getcontext(&ctx[i]);
ctx[i].uc_stack.ss_sp = stack[i];
ctx[i].uc_stack.ss_size = STACK_SIZE;
ctx[i].uc_link = &ctx[(i + 1) % 3]; // 设置下一个协程的上下文
}
// 创建三个协程并分别设置它们的入口函数
makecontext(&ctx[0], (void (*)(void))coroutine_func, 1, 0);
makecontext(&ctx[1], (void (*)(void))coroutine_func, 1, 1);
makecontext(&ctx[2], (void (*)(void))coroutine_func, 1, 2);
// 切换到第一个协程开始执行
swapcontext(&ctx[2], &ctx[0]);
return 0;
}
以上代码定义了三个协程(编号为0、1、2),每个协程会循环打印一些信息,并通过swapcontext
函数实现切换。程序运行时,会按照协程的顺序依次打印输出。
需要注意的是,使用
内容由零声教学AI助手提供,问题来源于学员提问