Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Other APIs

Boost , Chapter 1. Context , Rationale

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
setjmp()/longjmp()

C99 определяет<setjmp()>/<longjmp()>для обеспечения нелокальных прыжков, но не требует, чтобыlongjmp()Сохраняет текущую рамку стека. Следовательно, переход в функцию, которая была выведена через вызовlongjmp().не определен.

ucontext_t

С 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 fibers

Недостатком 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()>.



ISO/IEC 9899:1999, 2005, 7.13.2.1:2

ISO/IEC 9899:1999, 2005, J.2


PrevUpHomeNext

Статья Other APIs раздела Chapter 1. Context Rationale может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Rationale ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 07:28:10/0.007835865020752/1