1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/L_Lawliet_moon-coroutine

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Корутина

Корутина (Coroutine) — это пользовательский поток, управляемый приложением, разновидность зелёного потока (Green Thread). Использование корутин позволяет реализовать асинхронность в однопоточной среде. В этом репозитории реализованы корутины для платформы x86, включая 32- и 64-битные системы. Репозиторий компилируется на компиляторе GCC 11.2 и более ранних версиях GCC.

Введение

Тип функции

Для того чтобы адаптироваться к различным типам функций, объявленные корутинные функции в этой библиотеке должны иметь следующий вид:

void* foo(void* args);

При передаче параметров структуры должны передаваться через указатели, а базовые типы могут быть преобразованы в тип void* с возможным появлением предупреждений от компилятора.

Создание корутины

Запуск корутины осуществляется с помощью функции co_start:

void* foo(void*) {
    // ...
}

Coroutine foo_routine = co_start(foo, args);

После создания корутина переходит в состояние ожидания планирования.

yield

Функция co_yield позволяет передать управление планировщику, который переключается на другую корутину:

void* foo(void*) {
    // ...
    co_yield(); // --------------------------
    // ...      //                          |
}               //                          |
//                                          |
//                        -----------       |
//                   -----| excutor | <-----|
//                   |    -----------
//                   |
//                   |
void* bar(void*) {// |
    // ...           |
    co_yield();//    |
    // ...        <---
}

Ожидание завершения корутины (получение возвращаемого значения)

Функция co_wait используется для ожидания завершения корутины и получения её возвращаемого значения:

void *ret = co_wait(foo_routine);

Примечание: если не использовать co_wait, и при этом корутина не была уничтожена, это может привести к утечке памяти.

Отмена корутины (уничтожение корутины)

Функция co_cancel используется для отмены (или уничтожения) корутины:

co_cancel(foo_route);
// foo_route уничтожается и больше не будет планироваться

Структура проекта

В проекте есть несколько модулей, каждый из которых представляет собой каталог. Документы модулей находятся в файлах README в соответствующих каталогах. В корневом каталоге проекта находится файл predule.h, содержащий импорт различных часто используемых заголовочных файлов. Для получения более подробной информации рекомендуется обратиться к документации в каждом модульном каталоге.

Пример кода

Примеры кода можно найти в каталоге example.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Реализация библиотеки сопрограмм на языке C. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/L_Lawliet_moon-coroutine.git
git@api.gitlife.ru:oschina-mirror/L_Lawliet_moon-coroutine.git
oschina-mirror
L_Lawliet_moon-coroutine
L_Lawliet_moon-coroutine
master