C++ 如何知道哪个上下文处于活动状态?

C++ 如何知道哪个上下文处于活动状态?,c++,linux,ucontext,C++,Linux,Ucontext,有两个问题。 1.我可以找出当前处于活动状态的上下文吗? 2.我可以以某种方式将ucontext作为参数从一个函数传递到另一个函数吗。 我想做这样的事 //Instead of this #include <pthread.h> #include <iostream> #include <unistd.h> #include <stdio.h> #include <stdlib.h>

有两个问题。 1.我可以找出当前处于活动状态的上下文吗?
2.我可以以某种方式将ucontext作为参数从一个函数传递到另一个函数吗。 我想做这样的事

    //Instead of this


      #include <pthread.h>
    #include <iostream>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <ucontext.h>
    #include <queue>

    #define MEM 64000
    #define MEMS 16000
    #define MEL 32000
    using namespace std;
    ucontext_t N1,N2, Main;

    void fn1()
    {
    for(int i=0;i<=3;i++){
    cout<<i<<ndl;
    swapcontext(&N1,&N2);
    }
    }

    void fn2()
    { 
    for(int i=4;i<=7;i++){
    cout<<i<<endl;
    if(i==7)
    swapcontext(&N2,&Main);
    else
    swapcontext(&N2,&N1);
    }
    }
     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");
    exit(0);
    }
        //Do something like this

        void fn1()
        {
        for(int i=0;i<=3;i++){
        cout<<i<<endl;
        swapcontext(&N1,&Man);
        }
        }

        void fn2()
        { 
        for(int i=4;i<=7;i++){
        cout<<i<<endl;
        if(i==7)
        swapcontext(&N2,&Main);
        else
        swapcontext(&N2,&Man);
        }


       void Manager()// void Manager(ucontext_t u)??? and makecontext(&Man,(void(*)())Manager,1,...)
        {
        //which ucontext transferred control ?
         queue <ucontext> q;
        push.active_context;
        ...
        swapcontext(&Man,&another_context);
        }
//而不是这个
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义内存64000
#定义MEMS 16000
#定义MEL 32000
使用名称空间std;
ucontext_t N1、N2、Main;
无效fn1()
{
对于(int i=0;i
  • 我可以找出当前处于活动状态的上下文吗
  • 这对于
    getcontext()
    来说是微不足道的,但是您真正想知道的是哪个上下文在激活管理器之前处于活动状态。您不能这样做(除非旧上下文将信息存储在全局变量中)

  • 我可以以某种方式将ucontext作为参数从一个函数传递到另一个函数吗
  • 由于函数参数只能在函数输入时传递给管理器,并且管理器不会在其开始时重新输入,而是从
    swapcontext()
    返回,因此不能这样做

    要通过管理器实现控制权的传递,您可以让它确定要激活的上下文,例如

    void Manager()
    {
        ucontext_t *another_context = &N1;  // begin with N1
        for (;; another_context = another_context == &N1 ? &N2 : &N1)   // switch context
            swapcontext(&Man, another_context);
    }
    
    通过使用
    ucontext\u t
    数组而不是
    N1
    N2
    ,可以轻松地将其扩展到两个以上的上下文

    是否可以通过队列对某人执行此操作?也就是说,从中获取控件的上下文被放置在末尾,控件被转移到另一个上下文,而另一个上下文将在开头

    实际上,管理器不必是一个上下文,它可以是一个普通函数。而且由于队列必须是全局的(因此
    main()
    可以将执行上下文排队),因此管理器不需要传递任何参数。因此,管理器和执行函数可以如下所示:

    queue <ucontext *> q;
    void Manager()
    {
        ucontext_t *active_context = q.front(); // active context is at queue front
        q.pop();                                // remove active context from front
        q.push(active_context);                 // insert active context at the end
        swapcontext(active_context, q.front()); // switch to the new active context
    }
    
    void fn1()
    {
        for (int i=0; i<=3; i++)
        {
            cout<<i<<endl;
            Manager();
        }
    }
    
    void fn2()
    { 
        for (int i=4; i<=7; i++)
        {
            cout<<i<<endl;
            Manager();
        }
    }
    

    1) 定义“上下文”在本文中,嗯哼,上下文。2)发布a。目前不清楚您在问什么。请仔细阅读您的代码。您当前在那里的内容确实令人不快。非常感谢,我将尝试实现类似的功能。是否可以通过队列对某人执行此操作?也就是说,获取控件的上下文是放在最后,控制权转移到另一个,也就是在开始。PS:如何对数组执行类似操作?以下是我无法完成的任务。收到控制功能后,经理决定将控制权转移到哪个工作功能;决定如下:-描述挂起的工作函数的tor被放置在描述符队列的末尾;-工作函数的描述符从描述符队列的开头检索;-此函数被转移控制权。@AlexChek-我写了另一个答案,该答案使用任意数量的上下文队列。要对数组执行类似操作,我只需一种方法是将上下文放在数组中,然后移动元素或保持头和尾索引-等效,只是不那么优雅。
        q.push(&N1);
        q.push(&N2);
        swapcontext(&Main, q.front());  // switch to first context