swapcontext. Что означает поле uc_stack в структуре ucontext_t? Кто его использует? Сопрограмма или обработчик сигналов сопрограммы? Как я могу проверить это?

Что означает поле uc_stack в структуре ucontext_t? Кто его использует? Сопрограмма или обработчик сигналов сопрограммы? Как я могу проверить это? Например

#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;
}

Кто использует стек «consumer_stack», «consumer» или «sigHandler»? Как это доказать?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …