void init_setup(){ wiringPiSetup(); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(TRACK_SENS1, INPUT); pinMode(TRACK_SENS2, INPUT); setupBarrier(); }
void ThreadPool::sync() { Lock lock(this->thread_management); std::shared_ptr<Barrier> barrier; std::size_t num_workers = setupBarrier(barrier); synchronizeWorkers(num_workers, barrier); lock.unlock(); }
void ThreadPool::safeJoin(bool remove_workers) { Lock lock(this->thread_management); // don't allow a join from a worker thread if (this->unsafeIsCurrentThreadInPool()) { lock.unlock(); return; } // if a barrier already exists, just wait for that barrier to open // copy the shared_ptr so it doesn't get reset while waiting on it if (std::shared_ptr<Barrier> barrier = this->join_barrier) { lock.unlock(); barrier->wait(); return; } if (std::size_t num_workers = setupBarrier(this->join_barrier)) { // don't setup a barrier if there are no workers if (remove_workers) unsafeRemoveWorkersLater(num_workers, nullptr); else synchronizeWorkers(num_workers, this->join_barrier); lock.unlock(); // wait for the barrier to open, then destroy it this->join_barrier->wait(); this->join_barrier.reset(); } else lock.unlock(); }