boost::optional<T> next();
private:
- enum Flag { PARMAP_WORK, PARMAP_DESTROY };
-
/**
* @brief Thread data transmission structure
*/
Synchro* new_synchro(e_xbt_parmap_mode_t mode);
void work();
- Flag status; /**< is the parmap active or being destroyed? */
+ bool destroying; /**< is the parmap being destroyed? */
std::atomic_uint work_round; /**< index of the current round */
std::vector<std::thread*> workers; /**< worker thread handlers */
unsigned num_workers; /**< total number of worker threads including the controller */
XBT_CDEBUG(xbt_parmap, "Create new parmap (%u workers)", num_workers);
/* Initialize the thread pool data structure */
- this->status = PARMAP_WORK;
+ this->destroying = false;
this->work_round = 0;
this->workers.resize(num_workers);
this->num_workers = num_workers;
*/
template <typename T> Parmap<T>::~Parmap()
{
- status = PARMAP_DESTROY;
+ destroying = true;
synchro->master_signal();
for (unsigned i = 1; i < num_workers; i++) {
while (1) {
round++; // New scheduling round
parmap.synchro->worker_wait(round);
- if (parmap.status == PARMAP_DESTROY)
+ if (parmap.destroying)
break;
XBT_CDEBUG(xbt_parmap, "Worker %d got a job", data->worker_id);