// Copyright 2020 The Marl Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Simple "hello world" example that uses marl::Event and marl::WaitGroup. #include "marl/defer.h" #include "marl/event.h" #include "marl/scheduler.h" #include "marl/waitgroup.h" #include int main() { // Create a marl scheduler using the 4 hardware threads. // Bind this scheduler to the main thread so we can call marl::schedule() marl::Scheduler::Config cfg; cfg.setWorkerThreadCount(4); marl::Scheduler scheduler(cfg); scheduler.bind(); defer(scheduler.unbind()); // Automatically unbind before returning. constexpr int numTasks = 10; // Create an event that is manually reset. marl::Event sayHello(marl::Event::Mode::Manual); // Create a WaitGroup with an initial count of numTasks. marl::WaitGroup saidHello(numTasks); // Schedule some tasks to run asynchronously. for (int i = 0; i < numTasks; i++) { // Each task will run on one of the 4 worker threads. marl::schedule([=] { // All marl primitives are capture-by-value. // Decrement the WaitGroup counter when the task has finished. defer(saidHello.done()); printf("Task %d waiting to say hello...\n", i); // Blocking in a task? // The scheduler will find something else for this thread to do. sayHello.wait(); printf("Hello from task %d!\n", i); }); } sayHello.signal(); // Unblock all the tasks. saidHello.wait(); // Wait for all tasks to complete. printf("All tasks said hello.\n"); // All tasks are guaranteed to complete before the scheduler is destructed. }