static void competitor(int id)
{
XBT_INFO("Entering the race...");
- std::unique_lock<sg4::Mutex> lck(*mtx);
+ std::unique_lock lck(*mtx);
while (not ready) {
auto now = sg4::Engine::get_clock();
if (cv->wait_until(lck, now + (id+1)*0.25) == std::cv_status::timeout) {
{
XBT_INFO("Are you ready? ...");
sg4::this_actor::sleep_for(3);
- std::unique_lock<sg4::Mutex> lck(*mtx);
+ std::unique_lock lck(*mtx);
XBT_INFO("Go go go!");
ready = true;
cv->notify_all();
static void worker_fun(sg4::ConditionVariablePtr cv, sg4::MutexPtr mutex)
{
- std::unique_lock<sg4::Mutex> lock(*mutex);
+ std::unique_lock lock(*mutex);
XBT_INFO("Start processing data which is '%s'.", data.c_str());
data += std::string(" after processing");
{
// 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<sg4::Mutex> 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");
template <typename T> void Parmap<T>::PosixSynchro::master_signal()
{
- std::unique_lock<std::mutex> lk(ready_mutex);
+ std::unique_lock lk(ready_mutex);
this->parmap.thread_counter = 1;
this->parmap.work_round++;
/* wake all workers */
template <typename T> void Parmap<T>::PosixSynchro::master_wait()
{
- std::unique_lock<std::mutex> lk(done_mutex);
+ std::unique_lock lk(done_mutex);
/* wait for all workers to be ready */
done_cond.wait(lk, [this]() { return this->parmap.thread_counter >= this->parmap.num_workers; });
}
template <typename T> void Parmap<T>::PosixSynchro::worker_signal()
{
- std::unique_lock<std::mutex> lk(done_mutex);
+ std::unique_lock lk(done_mutex);
this->parmap.thread_counter++;
if (this->parmap.thread_counter == this->parmap.num_workers) {
/* all workers have finished, wake the controller */
template <typename T> void Parmap<T>::PosixSynchro::worker_wait(unsigned expected_round)
{
- std::unique_lock<std::mutex> lk(ready_mutex);
+ std::unique_lock lk(ready_mutex);
/* wait for more work */
ready_cond.wait(lk, [this, expected_round]() { return this->parmap.work_round == expected_round; });
}
int sg_cond_wait_for(sg_cond_t cond, sg_mutex_t mutex, double delay)
{
- std::unique_lock<simgrid::s4u::Mutex> lock(*mutex);
+ std::unique_lock lock(*mutex);
return cond->wait_for(lock, delay) == std::cv_status::timeout;
}
inline void acquire()
{
- std::unique_lock<std::mutex> lock(mutex_);
+ std::unique_lock lock(mutex_);
condition_.wait(lock, [this]() { return capa_ > 0; });
--capa_;
}
inline void release()
{
- std::unique_lock<std::mutex> lock(mutex_);
+ std::unique_lock lock(mutex_);
++capa_;
condition_.notify_one();
}
int StdRandom::uniform_int(int min, int max)
{
- std::uniform_int_distribution<> dist(min, max);
+ std::uniform_int_distribution dist(min, max);
return dist(mt19937_gen);
}
double StdRandom::uniform_real(double min, double max)
{
- std::uniform_real_distribution<> dist(min, max);
+ std::uniform_real_distribution dist(min, max);
return dist(mt19937_gen);
}
double StdRandom::exponential(double lambda)
{
- std::exponential_distribution<> dist(lambda);
+ std::exponential_distribution dist(lambda);
return dist(mt19937_gen);
}
double StdRandom::normal(double mean, double sd)
{
- std::normal_distribution<> dist(mean, sd);
+ std::normal_distribution dist(mean, sd);
return dist(mt19937_gen);
}
simgrid::xbt::random::set_implem_std();
simgrid::xbt::random::set_mersenne_seed(12345);
- std::exponential_distribution<> distA(25);
- std::uniform_int_distribution<> distB(1, 6);
- std::uniform_real_distribution<> distC(0, 1);
- std::normal_distribution<> distD(0, 2);
+ std::exponential_distribution distA(25.0);
+ std::uniform_int_distribution distB(1, 6);
+ std::uniform_real_distribution distC(0.0, 1.0);
+ std::normal_distribution distD(0.0, 2.0);
REQUIRE_THAT(simgrid::xbt::random::exponential(25), EpsilonApprox(distA(gen)));
REQUIRE(simgrid::xbt::random::uniform_int(1, 6) == distB(gen));