Enable build support by adding .onedev-buildspec.yml
cmake Loading last commit info...
docs
examples
play
source
tests
third_party
.clang-format
.clang-tidy
.gitignore
.gitmodules
CMakeLists.txt
README.md
README.md

TinyFiber πŸ€–

Π˜Π³Ρ€ΡƒΡˆΠ΅Ρ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ±Π΅Ρ€Ρ‹, написанныС для ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ.

ЦСль

ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π€Π°ΠΉΠ±Π΅Ρ€Ρ‹

Π€Π°ΠΉΠ±Π΅Ρ€Ρ‹ (fibers) – лСгковСсныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π€Π°ΠΉΠ±Π΅Ρ€Ρ‹ – ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅, ΠΎΠ½ΠΈ ΠΎΡ‚Π΄Π°ΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Ρ€ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌ синхронизации ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Yield).

Π€Π°ΠΉΠ±Π΅Ρ€Ρ‹ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы (carrier thread), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слуТит для Π½ΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ процСссором.

ΠžΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ + ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π΄Π°ΡŽΡ‚ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΠ·ΠΌ исполнСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

#include <tf/run.hpp>
#include <tf/sched/yield.hpp>
#include <tf/sched/spawn.hpp>

#include <fmt/core.h>

int main() {
  // Π Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΈ запускаСм Π² Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π°ΠΉΠ±Π΅Ρ€,
  // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ лямбду
  tf::RunScheduler([] {
    fmt::print("1");

    // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ±Π΅Ρ€
    // Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ этом остаСтся Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ±Π΅Ρ€Π°
    tf::JoinHandle h = tf::Spawn([] {
      fmt::print("->3");
      tf::Yield();  // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ
      fmt::print("->5");
    });

    fmt::print("->2");
    tf::Yield();  // ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ созданному Π²Ρ‹ΡˆΠ΅ Ρ„Π°ΠΉΠ±Π΅Ρ€Ρƒ
    fmt::print("->4");

    h.Join();  // ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ±Π΅Ρ€ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ

    fmt::print("->6");
  });
  // Π’Ρ‹Π·ΠΎΠ² RunScheduler Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΊΠΎΠ³Π΄Π° Π½Π΅ останСтся Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ„Π°ΠΉΠ±Π΅Ρ€ΠΎΠ²

  return 0;
}

Π’Ρ‹Π²ΠΎΠ΄:

1->2->3->4->5->6

Π‘ΠΌ. ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ тСсты.

ДокумСнтация

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ

  • Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° однопоточная
  • НСт сСти, ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ Ρ‚.ΠΏ.

References

Context switch

Fibers

Scheduler

ΠžΠΏΡ†ΠΈΠΈ CMake

  • TINY_FIBER_TESTS=ON – тСсты
  • TINY_FIBER_EXAMPLES=ON – ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π‘Π±ΠΎΡ€ΠΊΠ°

# Clone repo
git clone https://gitlab.com/Lipovsky/tinyfiber.git
cd tinyfiber
# Generate build files
mkdir build && cd build
cmake -DTINY_FIBER_EXAMPLES=ON ..
# Build `hello` example
make tinyfiber_example_hello
# Run example
./examples/hello/bin/tinyfiber_example_hello

Зависимости

  • Wheels – ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹
  • Sure – контСкст исполнСния

Π’Π½Π΅ΡˆΠ½ΠΈΠ΅

  • Fmt – Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄
Please wait...
Page is in error, reload to recover