C++ swapcontext。什么';结构ucontext_t?中字段uc_stack的含义;谁用它?协同程序或协同程序';什么是信号处理器?我如何测试它?
struct ucontext\u t中的字段uc\u 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
#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)
{
库特