我需要实现协程管理器。本身就是协程。它的工作方式如下:工作协程将控制权转移给协程管理器;协程经理在收到控制权后,决定将控制权转移给哪个工作协程; 该决定如下: -暂停的工作程序的句柄放在描述符队列的末尾; -从队列描述符中检索工作协程的描述符; 这个协程得到了控制。
我试图编写一个基于队列的函数。但是我不知道如何识别当前活跃的协程。此外,原则上,您可以使用队列method.pop()将控制权转移到另一个协程(swapcontext(&active,q.pop))。
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
#include <queue>
#define MEM 64000
#define MEMS 16000
using std::cout;
using std:: endl;
using std:: queue;
ucontext_t N1,N2, Main;
void fn1()
{
for(int i = 0; i <= 3; i++) {
cout << i << endl;
swapcontext(&N1, &N2);
}
cout << "func1 finished";
}
void fn2()
{
for(int i = 4; i <= 7; i++) {
cout << i << endl;
if(i==7)
swapcontext(&N2, &Main);
else
swapcontext(&N2, &N1);
}
cout << "func2 finished";
}
int main(int argc, char *argv[])
{
getcontext(&Main);
getcontext(&N1);
getcontext(&N2);
N1.uc_link = 0;
N1.uc_stack.ss_sp = malloc(MEM);
N1.uc_stack.ss_size = MEM;
N2.uc_link = 0;
N2.uc_stack.ss_sp = malloc(MEMS);
N2.uc_stack.ss_size = MEMS;
makecontext(&N1, fn1, 0);
makecontext(&N2, fn2, 0);
swapcontext(&Main, &N1);
printf("completed\n");
return 0;
}