C99 определяет<setjmp()
>/<longjmp()
>для обеспечения нелокальных прыжков, но не требует, чтобыlongjmp()Сохраняет текущую рамку стека. Следовательно, переход в функцию, которая была выведена через вызовlongjmp().не определен.
С POSIX.1-2003<ucontext_t
>обесценивается и удаляется в POSIX.1-2008! Функциональная подпись<makecontext()
>:
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
Третий аргумент<makecontext()
>определяет число целочисленных аргументов, которые последуют за ним и потребуют отбрасывания указателя функции, если<func
>примет те аргументы, которые не определены в C99.
Аргументы в списке var-arg должны быть целыми числами, проход указателей в списке var-arg не гарантируется, особенно это не сработает для архитектур, где указатели больше целых чисел.
<ucontext_t
>сохраняет маску сигнала между переключателями контекста, которая включает системные вызовы, потребляющие много циклов процессора (ucontext_t медленнее по коэффициенту 13x по сравнению с<fcontext_t
>).
Недостатком Windows Fiber API является то, что<CreateFiber()
>не принимает указатель на выделенное пользователю пространство стека, предотвращающий повторное использование стеков для других контекстных экземпляров. Потому что API Windows Fiber требует вызова<ConvertThreadToFiber()
>, если<SwitchFiber()
>вызывается для потока, который не был преобразован в волокно. По этой же причине<ConvertFiberToThread()
>должно быть вызвано после возвращения из<SwitchFiber()
>, если нить была вынуждена быть преобразована в волокно раньше (что неэффективно).
if ( ! is_a_fiber() )
{
ConvertThreadToFiber( 0);
SwitchToFiber( ctx);
ConvertFiberToThread();
}
Если условие<_WIN32_WINNT>=_WIN32_WINNT_VISTA
>выполнено, функция<IsThreadAFiber()
>обеспечивается для того, чтобы обнаружить, была ли уже преобразована текущая нить. К сожалению, Windows XP + SP 2/3 определяет<_WIN32_WINNT>=
_WIN32_WINNT_VISTA
>без предоставления<IsThreadAFiber()
>.