C++ swapcontext。什么';结构ucontext_t?中字段uc_stack的含义;谁用它?协同程序或协同程序';什么是信号处理器?我如何测试它?

C++ swapcontext。什么';结构ucontext_t?中字段uc_stack的含义;谁用它?协同程序或协同程序';什么是信号处理器?我如何测试它?,c++,coroutine,C++,Coroutine,struct ucontext\u t中的字段uc\u stack是什么意思?谁使用它?协同程序还是协同程序的信号处理程序?我如何测试它?比如说 #include <iostream> #include <ucontext.h> #include <queue> #include <signal.h> using namespace std; void sigHandler(int signo) { printf("sigHandler

struct ucontext\u t中的字段uc\u stack是什么意思?谁使用它?协同程序还是协同程序的信号处理程序?我如何测试它?比如说

#include <iostream>
#include <ucontext.h>
#include <queue>
#include <signal.h>

using namespace std;

void sigHandler(int signo)
{
    printf("sigHandler:%x\n", &signo);
    exit(-1);
}

queue<int> qProduct;
void consumer(ucontext_t* pConsumer, ucontext_t* pProducer)
{   
    char a[SIGSTKSZ] = {0};

    while(1)
    {
        if(qProduct.size() > 0)
        {
            cout << __FUNCTION__ << "|" << qProduct.front() << endl;
            qProduct.pop(); 
        }
        else
        {
            cout << pConsumer << "|" << pProducer << endl;
            swapcontext(pConsumer, pProducer);
        }
    }
}

void producer(ucontext_t* pConsumer, ucontext_t* pProducer, bool* pFinished)
{   

    for(int i=0; i<10; i++)
    {
        if(qProduct.size() < 5)
        {
            qProduct.push(i);
            cout << __FUNCTION__ << "|" << i << endl;

        }
        else
        {
            cout << pConsumer << "|P|" << pProducer << endl;
            swapcontext(pProducer, pConsumer);
        }
    }

    cout << pConsumer << "|P|" << pProducer << endl;
    swapcontext(pProducer, pConsumer);

    *pFinished = true;
}

int main(int argc, char* argv[])
{

     ucontext_t Main, Consumer, Producer;


    /* The stack for the iterator function. */
    char consumer_stack[SIGSTKSZ];
    char producer_stack[SIGSTKSZ];

    cout << "SIGSTKSZ:" << SIGSTKSZ << endl;

    /* Flag indicating that the iterator has completed. */
    volatile bool bFinished = false;


    getcontext(&Consumer);
    Consumer.uc_link = &Main;
    Consumer.uc_stack.ss_sp = consumer_stack;
    Consumer.uc_stack.ss_size = sizeof(consumer_stack); 
    makecontext(&Consumer, (void (*)(void))consumer, 2, &Consumer, &Producer);



    getcontext(&Producer);
    Producer.uc_link = &Main;
    Producer.uc_stack.ss_sp = producer_stack;
    Producer.uc_stack.ss_size = sizeof(producer_stack);
    makecontext(&Producer, (void (*)(void))producer, 3, &Consumer, &Producer,     &bFinished);


    if(!bFinished)
    {
        swapcontext(&Main, &Producer);
    }

    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
无效信号器(内部信号)
{
printf(“signandler:%x\n”、&signo);
出口(-1);
}
队列qProduct;
无效使用者(ucontext\u t*pConsumer,ucontext\u t*pProducer)
{   
字符a[SIGSTKSZ]={0};
而(1)
{
如果(qProduct.size()>0)
{
库特