Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os2.doc
Скачиваний:
0
Добавлен:
20.06.2023
Размер:
246.78 Кб
Скачать

2.4.3. Пример реализации сопрограмм средствами Windows api

В Windows API существует средство, называемое Fiber (нить).

Нити могут быть использованы для реализации «сопроцедур», посредствам которых приложение переключается между несколькими взаимосвязанными заданиями.

API нитей включает 6 функций:

  1. ConvertThreadToFiber – включение возможности использовать нити и превращение main-потока в главную нить.

  2. CreateFiber - Создание дополнительных нитей.

  3. GetFiberData – получение данных, сформированных при создании нити.

  4. GetCurrentFiber – получение идентификатора активной нити (собственного идентификатора).

  5. SwitchToFiber – переключение на другую нить.

  6. DeleteFiber – удаление нити.

Нити имеют собственные стеки.

Существует два способа управления нитями:

  1. Управление «ведущий-ведомый», когда все нити передают управление главной нити, а та в свою очередь решает, какой из нитей передать управление.

  1. Равноправное управление, когда сама нить определяет, какая из нитей будет выполняться следующей.

Ниже приведен текст примера, использующего нити Win32.

#include <windows.h>

#include <stdio.h>

#define FIBER_COUNT 3 // total number of fibers (including primary)

#define MAIN_FIBER 0 // array index to main fiber

#define FIRST_FIBER 1 // array index to first fiber

#define SECOND_FIBER 2 // array index to second fiber

LPVOID lpFiber[FIBER_COUNT];

//===================================================================

VOID __stdcall FirstFiberFunc(LPVOID lpParameter) {

int i = 0;

while (1) {

printf("FirstFiberFunc; i = %d\n",i);

i++;

if (i > 11) {

break;

}

SwitchToFiber(lpFiber[SECOND_FIBER]);

}

printf("FirstFiberFunc: return to main fiber\n");

SwitchToFiber(lpFiber[MAIN_FIBER]);

}

//===================================================================

VOID __stdcall SecondFiberFunc(LPVOID lpParameter){

int i = 0;

while (1) {

printf("SecondFiberFunc; i = %d\n",i);

i++;

if (i > 10) {

break;

}

SwitchToFiber(lpFiber[FIRST_FIBER]);

}

printf("SecondFiberFunc: return to main fiber\n");

SwitchToFiber(lpFiber[MAIN_FIBER]);

}

//====================================================================

int __cdecl main(int argc,char *argv[]){

lpFiber[MAIN_FIBER] = ConvertThreadToFiber(NULL);

lpFiber[FIRST_FIBER] = CreateFiber(0, FirstFiberFunc, NULL);

lpFiber[SECOND_FIBER] = CreateFiber(0, SecondFiberFunc, NULL);

SwitchToFiber(lpFiber[FIRST_FIBER]);

DeleteFiber(lpFiber[FIRST_FIBER]);

DeleteFiber(lpFiber[SECOND_FIBER]);

printf("main fiber\n");

return 0;

}

//====================================================================

2.4.4. Пример реализации сопрограмм средствами ос Linux

См. метод. указания к лаб. работам.

Важно!

Этапы создания задач-сопрограмм во всех трех примерах одни и те же. Это:

  1. Выделение памяти под стеки (стек для main выделять не надо);

  2. Выделение памяти под дескрипторы (в том числе и для main);

  3. Необходимым образом выполненная инициализация стеков;

  4. Необходимым образом выполнение инициализации дескрипторов;

  5. Переход из задачи main в одну из сопрограмм;

  6. Переключение сопрограмм по требуемому алгоритму;

  7. Возвращение в задачу main.

Соседние файлы в предмете Операционные системы