diff --git a/examples/concurrency.cc b/examples/concurrency.cc index e4290a5..f659bb1 100644 --- a/examples/concurrency.cc +++ b/examples/concurrency.cc @@ -3,38 +3,31 @@ using namespace ostd; -template -void foo(S &sched) { - auto arr = ostd::iter({ 150, 38, 76, 25, 67, 18, -15, -38, 25, -10 }); - - auto h1 = arr.slice(0, arr.size() / 2); - auto h2 = arr.slice(arr.size() / 2, arr.size()); - - auto c = sched.template make_channel(); - auto f = [](auto c, auto half) { - c.put(foldl(half, 0)); - }; - sched.spawn(f, c, h1); - sched.spawn(f, c, h2); - - int a, b; - c.get(a); - c.get(b); - writefln("first half: %s", a); - writefln("second half: %s", b); - writefln("total: %s", a + b); -} - int main() { + auto foo = [](auto &sched) { + auto arr = ostd::iter({ 150, 38, 76, 25, 67, 18, -15, 215, 25, -10 }); + + auto c = sched.template make_channel(); + auto f = [](auto c, auto half) { + c.put(foldl(half, 0)); + }; + sched.spawn(f, c, arr.slice(0, arr.size() / 2)); + sched.spawn(f, c, arr.slice(arr.size() / 2, arr.size())); + + int a, b; + c.get(a), c.get(b); + writefln("%s + %s = %s", a, b, a + b); + }; + thread_scheduler tsched; - tsched.start([&tsched]() { + tsched.start([&tsched, &foo]() { writeln("thread scheduler: starting..."); foo(tsched); writeln("thread scheduler: finishing..."); }); simple_coroutine_scheduler scsched; - scsched.start([&scsched]() { + scsched.start([&scsched, &foo]() { writeln("simple coroutine scheduler: starting..."); foo(scsched); writeln("simple coroutine scheduler: finishing..."); @@ -43,13 +36,9 @@ int main() { /* thread scheduler: starting... -first half: 356 -second half: -20 -total: 336 +356 + 233 = 589 thread scheduler: finishing... simple coroutine scheduler: starting... -first half: 356 -second half: -20 -total: 336 +356 + 233 = 589 simple coroutine scheduler: finishing... */