Что касается переносимости, setjmp()
является переносимым для всех размещенных реализаций C; <ucontext.h>
функции являются частью расширений XSI для POSIX - это делает setjmp()
значительно более портативным.
Можно использовать setjmp()
потокобезопасным способом. Не имеет смысла использовать функции ucontext
в многопоточной программе - вы бы использовали несколько потоков, а не несколько контекстов.
Используйте setjmp()
, если вы хотите быстро вернуться из глубоко вложенного вызова функции (вот почему вы обнаружите, что большинство примеров показывают его использование для обработки исключений). Используйте функции ucontext
для реализации потоков или сопрограмм в пространстве пользователя (или вообще не используйте их).
«Быстрый и безопасный» вопрос не имеет смысла. Реализации, как правило, выполняются настолько быстро, насколько это практически возможно, но они выполняют разные функции, поэтому их нельзя сравнивать напрямую (функции ucontext
выполняют больше работы, поэтому обычно будут работать немного медленнее).
Обратите внимание, что функции ucontext
перечислены как устаревшие в двух последних выпусках POSIX. Вместо этого обычно следует использовать функции потоков pthreads.