У меня был вопрос об использовании setjmp и longjump для создания стеков функций, которые могут работать независимо друг от друга. Со ссылкой на этот вопрос
Здесь стек функций для B(), кажется, находится поверх стека для A, поэтому, когда A выходит за рамки, и я пытаюсь перейти к B(), код segfaults. Измененный код выглядит так
#include <stdio.h>
#include <setjmp.h>
#include <iostream>
using namespace std;
jmp_buf bufferA, bufferB;
void routineB(); // forward declaration
void routineA()
{
int r ;
printf("(A1)\n");
r = setjmp(bufferA);
if (r == 0) routineB();
printf("(A2) r=%d\n",r);
r = setjmp(bufferA);
if (r == 0) longjmp(bufferB, 20001);
printf("(A3) r=%d\n",r);
r = setjmp(bufferA);
if (r == 0) longjmp(bufferB, 20002);
printf("(A4) r=%d\n",r);
}
void routineB()
{
int r;
printf("(B1)\n");
r = setjmp(bufferB);
if (r == 0) longjmp(bufferA, 10001);
printf("(B2) r=%d\n", r);
r = setjmp(bufferB);
if (r == 0) longjmp(bufferA, 10002);
printf("(B3) r=%d\n", r);
r = setjmp(bufferB);
if (r == 0) longjmp(bufferA, 10003);
cout << "WHAT" << endl;
}
int main(int argc, char **argv)
{
routineA();
longjmp(bufferB, 123123);
return 0;
}
Я подумал, что у нас может быть одна основная функция, к которой каждая сопрограмма (в данном случае B и A) возвращается, а затем, в свою очередь, переходит к одной из сопрограмм, если они живы. Будет ли это работать или это также приведет к segfault, потому что некоторые из стеков для сопрограмм, которые, возможно, мертвы, находятся поверх тех, которые хотят работать?
Если кажется, что он должен segfault, то как можно реализовать такие независимые сопрограммы (которые могут работать, когда другие умерли и не зависят друг от друга) на C++?
ПРИМЕЧАНИЕ. Я не хочу использовать swapcontext, makecontext, setcontext и getcontext, поскольку они устарели. Цель этого поста — помочь мне найти альтернативы этим функциям.
Заранее спасибо!
longjmp()
войти в функцию, находящуюся глубже в стеке вызовов, чем выполняемая в данный момент функция. - person The Paramagnetic Croissant   schedule 29.10.2015how can one implement such independent couroutines (which can run when others have died and don't depend on each other)
с помощью setjmp/longjmp нельзя. Вам нужна упреждающая многозадачность (или многопоточность), которая возможна только при использовании какого-либо привилегированного супервизора. Хотя вы можете поймать глубокие ошибки, т.е. своего рода обработку исключений C. - person Matt   schedule 29.10.2015