/fiber

Primary LanguageC++

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

Зависимости

  • Wheels – общие компоненты
  • Context – контекст исполнения