协程经理

时间:2019-05-02 19:50:17

标签: c++ linux ucontext

我需要实现协程管理器。本身就是协程。它的工作方式如下:工作协程将控制权转移给协程管理器;协程经理在收到控制权后,决定将控制权转移给哪个工作协程;  该决定如下: -暂停的工作程序的句柄放在描述符队列的末尾; -从队列描述符中检索工作协程的描述符;  这个协程得到了控制。

我试图编写一个基于队列的函数。但是我不知道如何识别当前活跃的协程。此外,原则上,您可以使用队列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;
}

0 个答案:

没有答案