Корутина (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);
После создания корутина переходит в состояние ожидания планирования.
Функция 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 )