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

2.4.3. Пример реализации сопрограмм в Win32

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

Нити могут быть использованы для достижения следующих целей:

  1. Для переноса приложений UNIX, в которых используется управление потоками, в среду Windows.

  2. Для реализации сопроцедур, посредствам чего приложение переключается между несколькими взаимосвязанными заданиями.

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

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

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

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

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

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

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

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

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

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

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

Ниже приведен текст примера, использующего нити 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;

}

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

Вопрос (

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

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

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

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

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

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

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

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

)Вопрос

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]