|
|
22 апреля 2011
Оглавление: 1. Setcontext 2. Пример
setcontext — одна из библиотечных функций стандарта POSIX, используемая для управления контекстом. Семейство setcontext позволяет реализовать на языке Cи такие паттерны проектирования управления потоком, как итераторы, нити и сопрограммы. Семейство можно рассматривать как расширенную версию setjmp/longjmp; в то время как последние позволяют только один нелокальный прыжок из стека, setcontext позволяет создание нескольких взаимодействующих потоков управления с собственными стеками.
Спецификация
setcontext определён в POSIX.1-2001 и во второй версии Single UNIX Specification, однако доступен не во всех UNIX-подобных операционных системах. Функции и связанные с ними типы определены в заголовочном файле ucontext.h . В их число входит тип ucontext_t , с которым взаимодействуют все четыре функции:
typedef struct ucontext {
struct ucontext *uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
...
} ucontext_t;
uc_link указывает на контекст, который будет восстановлен при выходе из текущего контекста, если контекст создан с помощью makecontext . uc_sigmask используется для хранения сигналов, заблокированных в контексте, а uc_stack является стеком, используемым контекстом. uc_mcontext используется для хранения состояния исполнения, включая все Регистр процессора центрального процессора, указатель инструкцию и указатель на стек; mcontext_t является непрозрачным указателем.
Также определены следующие функции:
- Эта функция переносит управление в контекст в
ucp . Исполнение продолжается с точки, на которой контекст был сохранён в ucp . В случае успешного выполнения возврата из setcontext не производится.
- Сохраняет текущий контекст в
ucp . Возврат из этой функции происходит в двух случаях: после первичного вызова или при переключении потока на контекст в ucp с помощью setcontext или swapcontext . Функция getcontext не предоставляет возвращаемого значения для разделения этих случаев, поэтому разработчик должен явным образом использовать переменную-флаг, объявленную без модификатора register и с модификатором volatile во избежание свёртывания константных выражений и других оптимизаций компилятора.
void makecontext, int argc, ...)
- Функция
makecontext устанавливает альтернативный поток управления в ucp , предварительно инициализированный с помощью getcontext . Поле ucp.uc_stack должно указывать на место для стека необходимого размера; обычно используется константа SIGSTKSZ . При совершении прыжка в ucp с помощью setcontext или swapcontext исполнение начинается с точки входа в функцию func с числом аргументов argc . При завершении func управление передаётся ucp.uc_link .
- Передаёт управление
ucp и сохраняет текущее состояние выполнения в oucp .
Просмотров: 1784
|