// WorkerThreads dispatcher implemented with semaphores class WorkerTaskDispatcher { // The task currently being dispatched to the WorkerThreads.
WorkerTask* _task;
// Semaphore used to start the WorkerThreads.
Semaphore _start_semaphore; // Semaphore used to notify the coordinator that all workers are done.
Semaphore _end_semaphore;
public:
WorkerTaskDispatcher();
// Coordinator API.
// Distributes the task out to num_workers workers. // Returns when the task has been completed by all workers. void coordinator_distribute_task(WorkerTask* task, uint num_workers);
// Worker API.
// Waits for a task to become available to the worker and runs it. void worker_run_task();
};
// A set of worker threads to execute tasks class WorkerThreads : public CHeapObj<mtInternal> { private: constchar* const _name;
WorkerThread** _workers; const uint _max_workers;
uint _created_workers;
uint _active_workers;
WorkerTaskDispatcher _dispatcher;
// Temporarily try to set the number of active workers. // It's not guaranteed that it succeeds, and users need to // query the number of active workers. class WithActiveWorkers : public StackObj { private:
WorkerThreads* const _workers; const uint _prev_active_workers;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.