X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1a64ca4c11a1eb7ba2ecd102f877ac571486a034..92fe1e32f2111e4720e80429af53d976b31bf80b:/examples/cpp/synchro-mutex/s4u-synchro-mutex.cpp diff --git a/examples/cpp/synchro-mutex/s4u-synchro-mutex.cpp b/examples/cpp/synchro-mutex/s4u-synchro-mutex.cpp index 01aa75124f..648024aa78 100644 --- a/examples/cpp/synchro-mutex/s4u-synchro-mutex.cpp +++ b/examples/cpp/synchro-mutex/s4u-synchro-mutex.cpp @@ -1,17 +1,20 @@ -/* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-2022. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include /* std::mutex and std::lock_guard */ #include "simgrid/s4u.hpp" /* All of S4U */ +#include "xbt/config.hpp" +#include /* std::mutex and std::lock_guard */ -constexpr int NB_ACTOR = 6; +namespace sg4 = simgrid::s4u; + +static simgrid::config::Flag cfg_actor_count("actors", "How many pairs of actors should be started?", 6); XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "a sample log category"); /* This worker uses a classical mutex */ -static void worker(simgrid::s4u::MutexPtr mutex, int& result) +static void worker(sg4::MutexPtr mutex, int& result) { // lock the mutex before enter in the critical section mutex->lock(); @@ -26,11 +29,11 @@ static void worker(simgrid::s4u::MutexPtr mutex, int& result) mutex->unlock(); } -static void workerLockGuard(simgrid::s4u::MutexPtr mutex, int& result) +static void workerLockGuard(sg4::MutexPtr mutex, int& result) { // Simply use the std::lock_guard like this // It's like a lock() that would do the unlock() automatically when getting out of scope - std::lock_guard lock(*mutex); + std::lock_guard lock(*mutex); // then you are in a safe zone XBT_INFO("Hello s4u, I'm ready to compute after a lock_guard"); @@ -43,27 +46,27 @@ static void workerLockGuard(simgrid::s4u::MutexPtr mutex, int& result) static void master() { - int result = 0; - simgrid::s4u::MutexPtr mutex = simgrid::s4u::Mutex::create(); - - for (int i = 0; i < NB_ACTOR * 2 ; i++) { - // To create a worker use the static method simgrid::s4u::Actor. - if((i % 2) == 0 ) - simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Jupiter"), workerLockGuard, mutex, - std::ref(result)); - else - simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Tremblay"), worker, mutex, std::ref(result)); + /* Create the requested amount of actors pairs. Each pair has a specific mutex and cell in `result`. */ + int result[cfg_actor_count.get()]; + + sg4::MutexPtr mutex = sg4::Mutex::create(); + for (int i = 0; i < cfg_actor_count; i++) { + result[i] = 0; + sg4::MutexPtr mutex = sg4::Mutex::create(); + sg4::Actor::create("worker", sg4::Host::by_name("Jupiter"), workerLockGuard, mutex, std::ref(result[i])); + sg4::Actor::create("worker", sg4::Host::by_name("Tremblay"), worker, mutex, std::ref(result[i])); } - simgrid::s4u::this_actor::sleep_for(10); - XBT_INFO("Results is -> %d", result); + sg4::this_actor::sleep_for(10); + for (int i = 0; i < cfg_actor_count; i++) + XBT_INFO("Result[%d] -> %d", i, result[i]); } int main(int argc, char **argv) { - simgrid::s4u::Engine e(&argc, argv); + sg4::Engine e(&argc, argv); e.load_platform("../../platforms/two_hosts.xml"); - simgrid::s4u::Actor::create("main", simgrid::s4u::Host::by_name("Tremblay"), master); + sg4::Actor::create("main", e.host_by_name("Tremblay"), master); e.run(); return 0;