Tiny Fibers
Минималистичная библиотека файберов, написанная для образовательных целей.
Цель
Продемонстрировать базовую механику работы потоков.
Файберы
Файберы (fibers) – легковесные потоки, реализованные целиком в пространстве пользователя.
Особенности реализации
Файберы – кооперативные, они отдают управление только добровольно и явно (например, с помощью вызова Yield
).
Файберы исполняются в одном потоке операционной системы (carrier thread), который служит для них виртуальным процессором.
Однопоточный планировщик + кооперативность дают детерминизм.
Пример
#include <tinyfibers/api.hpp>
#include <iostream>
using namespace tinyfibers;
int main() {
// Стартуем планировщик и запускаем в нем файбер,
// исполняющий переданную лямбду
RunScheduler([]() {
std::cout << "Hello from parent!" << std::endl;
// Запускаем еще один файбер,
// управление при этом остается у текущего файбера
JoinHandle child = Spawn([]() {
std::cout << "Hello from child!" << std::endl;
});
child.Join(); // Блокируем текущий файбер до завершения дочернего
std::cout << "Child finished" << std::endl;
});
// Вызов RunScheduler завершится когда не останется готовых исполняться файберов
return 0;
}
Вывод:
Hello from parent!
Hello from child!
Child finished
Документация
Ограничения
- Библиотека однопоточная
- Поддерживается только x86-64
- Нет сети, каналов и т.п.
References
Context switch
Fibers
Scheduler
Опции CMake
TINY_FIBERS_TESTS=ON
– тестыTINY_FIBERS_EXAMPLES=ON
– примеры
Сборка
# Clone repo
git clone https://gitlab.com/Lipovsky/tinyfibers.git
cd tinyfibers
# Generate build files
mkdir build && cd build
cmake -DTINY_FIBERS_EXAMPLES=ON ..
# Build `hello` example
make tinyfibers_example_hello
# Run example
./examples/hello/bin/tinyfibers_example_hello