Как сделать стек спагетти с C? - PullRequest
3 голосов
/ 12 сентября 2011

Я пытаюсь сделать сопрограмму и продолжить с C. Я понял, что мне нужен какой-то стек спагетти.Возможно ли выполнить функцию в новом стеке вызовов?Конечно, в пределах одного потока.Как я могу создать новый, отдельный стек вызовов и выполнить на нем некоторый код?

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

проверить makecontext / swapcontext.

Если они недоступны, вы можете использовать setjmp / longjmp, но они немного сложнее.

2 голосов
/ 12 сентября 2011

Если вы работаете в Windows, вы можете заглянуть в Fibers API .Однако ответ Evil Otto более переносимый / POSIX-совместимый.

0 голосов
/ 21 марта 2013

Я до сих пор не уверен в продолжениях, но, по крайней мере, для сопрограмм, нет хорошего способа сделать это в C. Потому что это вне абстракции C.setjmp/longjmp имеет ограничение области действия, может нарушить работу системы исключений C ++ / Objective-C, makecontext/swapcontext устарело.Хотя некоторые системы все еще поддерживают функции, но, по крайней мере, Apple OS больше не поддерживает их.

Единственное приемлемое решение для меня было libtask библиотека .Который использует специфичные для архитектуры коды сборки для сохранения и восстановления состояния регистра, а также управляет стеками вызовов.Я думаю, что он использует монолитный стек и все еще имеет ограничение по размеру, но в любом случае, это почти единственное решение, которое я смог найти, которое надежно работает.) функция включит очень общую поддержку сопрограмм на уровне C.И я надеюсь позже свободно написать код сопрограммы на LLVM.

...