cmake | Loading last commit info... | |
docs | ||
examples | ||
play | ||
source | ||
tests | ||
third_party | ||
.clang-format | ||
.clang-tidy | ||
.gitignore | ||
.gitmodules | ||
CMakeLists.txt | ||
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
- Boost.fiber
- folly::fibers
- Marl
- Project Loom: Fibers and Continuations for the Java Virtual Machine
- Fibers, Oh My!
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
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
ΠΠ½Π΅ΡΠ½ΠΈΠ΅
- Fmt β ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²ΡΠ²ΠΎΠ΄