Nektar++
Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | Friends | List of all members
Nektar::Thread::ThreadManagerBoost Class Reference

Implementation of ThreadManager using Boost threads. More...

#include <ThreadBoost.h>

Inheritance diagram for Nektar::Thread::ThreadManagerBoost:
[legend]

Public Member Functions

 ThreadManagerBoost (unsigned int numWorkers)
 Constructs a ThreadManagerBoost. More...
 
virtual ~ThreadManagerBoost ()
 Shuts down threading. More...
 
- Public Member Functions inherited from Nektar::Thread::ThreadManager
virtual ~ThreadManager ()
 Destructor. More...
 
void QueueJobs (std::vector< ThreadJob * > &joblist)
 Pass a list of tasklets to the master queue. More...
 
void QueueJob (ThreadJob *job)
 Pass a single job to the master queue. More...
 
unsigned int GetNumWorkers ()
 Return the number of active workers. More...
 
unsigned int GetWorkerNum ()
 Returns the worker number of the executing thread. More...
 
void SetNumWorkers (const unsigned int num)
 Sets the number of active workers. More...
 
void SetNumWorkers ()
 Sets the number of active workers to the maximum. More...
 
unsigned int GetMaxNumWorkers ()
 Gets the maximum available number of threads. More...
 
void Wait ()
 Waits until all queued jobs are finished. More...
 
void SetChunkSize (unsigned int chnk)
 Controls how many jobs are sent to each worker at a time. More...
 
void SetSchedType (SchedType s)
 Sets the current scheduling algorithm. More...
 
bool InThread ()
 Indicates whether the code is in a worker thread or not. More...
 
void Hold ()
 A calling threads holds until all active threads call this method. More...
 
const std::string & GetType ()
 Returns a description of the type of threading. More...
 
bool IsInitialised ()
 ThreadManager implementation. More...
 
int GetThrFromPartition (int pPartition)
 
int GetRankFromPartition (int pPartition)
 
int GetPartitionFromRankThr (int pRank, unsigned int pThr)
 

Static Public Member Functions

static ThreadManagerSharedPtr Create (unsigned int numT)
 Called by the factory method. More...
 

Protected Member Functions

virtual void v_QueueJobs (std::vector< ThreadJob * > &joblist) override
 
virtual void v_QueueJob (ThreadJob *job) override
 
virtual unsigned int v_GetNumWorkers () override
 
virtual unsigned int v_GetWorkerNum () override
 
virtual void v_SetNumWorkers (const unsigned int num) override
 
virtual void v_SetNumWorkers () override
 
virtual unsigned int v_GetMaxNumWorkers () override
 
virtual void v_Wait () override
 
virtual void v_SetChunkSize (unsigned int chnk) override
 
virtual void v_SetSchedType (SchedType s) override
 
virtual bool v_InThread () override
 
virtual void v_Hold () override
 
virtual const std::string & v_GetType () const override
 
- Protected Member Functions inherited from Nektar::Thread::ThreadManager
virtual bool v_IsInitialised ()
 

Private Member Functions

 ThreadManagerBoost ()
 
 ThreadManagerBoost (const ThreadManagerBoost &)
 
bool IsWorking ()
 
void SetNumWorkersImpl (const unsigned int num)
 

Private Attributes

const unsigned int m_numThreads
 
unsigned int m_numWorkers
 
std::queue< ThreadJob * > m_masterQueue
 
boost::mutex m_masterQueueMutex
 
boost::mutex m_masterActiveMutex
 
boost::condition_variable m_masterQueueCondVar
 
boost::condition_variable m_masterActiveCondVar
 
ThreadWorkerBoost ** m_threadList
 
boost::thread ** m_threadThreadList
 
boost::thread::id m_masterThreadId
 
bool * m_threadBusyList
 
bool * m_threadActiveList
 
unsigned int m_chunkSize
 
SchedType m_schedType
 
boost::barrier * m_barrier
 
std::map< boost::thread::id, unsigned int > m_threadMap
 
std::string m_type
 

Static Private Attributes

static std::string className
 

Friends

class ThreadWorkerBoost
 

Detailed Description

Implementation of ThreadManager using Boost threads.

Definition at line 58 of file ThreadBoost.h.

Constructor & Destructor Documentation

◆ ThreadManagerBoost() [1/3]

Nektar::Thread::ThreadManagerBoost::ThreadManagerBoost ( unsigned int  numT)

Constructs a ThreadManagerBoost.

Parameters
numWorkersThe number of threads to start (including master thread).
Note
Do not use, use factory instead.

Definition at line 55 of file ThreadBoost.cpp.

56  : m_numThreads(numT), m_numWorkers(numT), m_masterQueue(),
59  m_threadMap()
60 {
61  using namespace std;
62  try
63  {
65  m_threadThreadList = new boost::thread *[m_numThreads];
66  m_threadBusyList = new bool[m_numThreads];
67  m_threadActiveList = new bool[m_numThreads];
68  }
69  catch (exception &e)
70  {
71  cerr << "Exception while allocating thread storage: " << e.what()
72  << endl;
73  abort();
74  }
75  unsigned int i = 0;
76  while (i < m_numThreads)
77  {
79  try
80  {
81  tw = new ThreadWorkerBoost(this, i);
82  }
83  catch (exception &e)
84  {
85  cerr << "Exception while allocating worker threads: " << e.what()
86  << endl;
87  abort();
88  }
89 
90  m_threadList[i] = tw;
91  m_threadBusyList[i] = false;
92  m_threadActiveList[i] = true;
93 
94  try
95  {
96  m_threadThreadList[i] = new boost::thread(boost::ref(*tw));
97  boost::thread::id id = m_threadThreadList[i]->get_id();
98  m_threadMap[id] = i;
99  }
100  catch (...)
101  {
102  std::cerr << "Exception while creating worker threads" << std::endl;
103  abort();
104  }
105  i++;
106  }
107  m_masterThreadId = boost::this_thread::get_id();
108  m_barrier = new boost::barrier(m_numWorkers > 0 ? m_numWorkers : 1);
109  m_type = "Threading with Boost";
110 }
ThreadWorkerBoost ** m_threadList
Definition: ThreadBoost.h:106
boost::condition_variable m_masterQueueCondVar
Definition: ThreadBoost.h:104
boost::thread::id m_masterThreadId
Definition: ThreadBoost.h:108
const unsigned int m_numThreads
Definition: ThreadBoost.h:99
std::queue< ThreadJob * > m_masterQueue
Definition: ThreadBoost.h:101
std::map< boost::thread::id, unsigned int > m_threadMap
Definition: ThreadBoost.h:114
boost::condition_variable m_masterActiveCondVar
Definition: ThreadBoost.h:105

References m_barrier, m_masterThreadId, m_numThreads, m_numWorkers, m_threadActiveList, m_threadBusyList, m_threadList, m_threadMap, m_threadThreadList, m_type, and ThreadWorkerBoost.

◆ ~ThreadManagerBoost()

Nektar::Thread::ThreadManagerBoost::~ThreadManagerBoost ( )
virtual

Shuts down threading.

Terminates all running threads (they will finish their current job), releases resources and destructs.

Definition at line 116 of file ThreadBoost.cpp.

117 {
118  // This is an immediate teardown. We attempt to kill everything.
119  // we daren't lock anything as we may cause a deadlock
120  for (unsigned int i = 0; i < m_numThreads; i++)
121  {
122  m_threadList[i]->Stop();
123  }
124 
125  m_masterQueueCondVar.notify_all();
126  m_masterActiveCondVar.notify_all();
127  for (unsigned int i = 0; i < m_numThreads; i++)
128  {
129  m_threadThreadList[i]->join();
130  delete m_threadThreadList[i];
131  delete m_threadList[i];
132  }
133 
134  delete[] m_threadList;
135  delete[] m_threadThreadList;
136  delete[] m_threadActiveList;
137  delete[] m_threadBusyList;
138  delete m_barrier;
139 }
void Stop()
A signal to shut down.
Definition: ThreadBoost.h:155

References m_barrier, m_masterActiveCondVar, m_masterQueueCondVar, m_numThreads, m_threadActiveList, m_threadBusyList, m_threadList, m_threadThreadList, and Nektar::Thread::ThreadWorkerBoost::Stop().

◆ ThreadManagerBoost() [2/3]

Nektar::Thread::ThreadManagerBoost::ThreadManagerBoost ( )
private

Referenced by Create().

◆ ThreadManagerBoost() [3/3]

Nektar::Thread::ThreadManagerBoost::ThreadManagerBoost ( const ThreadManagerBoost )
private

Member Function Documentation

◆ Create()

static ThreadManagerSharedPtr Nektar::Thread::ThreadManagerBoost::Create ( unsigned int  numT)
inlinestatic

Called by the factory method.

Definition at line 72 of file ThreadBoost.h.

73  {
74  return std::shared_ptr<ThreadManager>(new ThreadManagerBoost(numT));
75  }

References ThreadManagerBoost().

◆ IsWorking()

bool Nektar::Thread::ThreadManagerBoost::IsWorking ( )
private

Definition at line 166 of file ThreadBoost.cpp.

167 {
168  bool working = false;
169  Lock masterActiveLock(m_masterActiveMutex);
170  for (unsigned int i = 0; i < m_numWorkers; i++)
171  {
172  working = working || m_threadBusyList[i];
173  }
174  return working;
175 }
boost::unique_lock< boost::mutex > Lock
Definition: ThreadBoost.h:51

References m_masterActiveMutex, m_numWorkers, and m_threadBusyList.

Referenced by v_Wait().

◆ SetNumWorkersImpl()

void Nektar::Thread::ThreadManagerBoost::SetNumWorkersImpl ( const unsigned int  num)
private

Definition at line 243 of file ThreadBoost.cpp.

244 {
245  Lock masterActiveLock(m_masterActiveMutex); // locks the active
246 
247  if (m_numWorkers == num)
248  {
249  return;
250  }
251 
252  delete m_barrier;
253  m_barrier = new boost::barrier(num > 0 ? num : 1);
254 
255  m_numWorkers = num;
256  for (unsigned int i = 0; i < m_numThreads; i++)
257  {
258  m_threadActiveList[i] = i < m_numWorkers ? true : false;
259  }
260  m_masterActiveCondVar.notify_all();
261 } // Lock on active released here

References m_barrier, m_masterActiveCondVar, m_masterActiveMutex, m_numThreads, m_numWorkers, and m_threadActiveList.

Referenced by v_SetNumWorkers().

◆ v_GetMaxNumWorkers()

unsigned int Nektar::Thread::ThreadManagerBoost::v_GetMaxNumWorkers ( )
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 285 of file ThreadBoost.cpp.

286 {
287  return m_numThreads;
288 }

References m_numThreads.

◆ v_GetNumWorkers()

unsigned int Nektar::Thread::ThreadManagerBoost::v_GetNumWorkers ( )
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 226 of file ThreadBoost.cpp.

227 {
228  return m_numWorkers;
229 }

References m_numWorkers.

◆ v_GetType()

const std::string & Nektar::Thread::ThreadManagerBoost::v_GetType ( ) const
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 301 of file ThreadBoost.cpp.

302 {
303  return m_type;
304 }

References m_type.

◆ v_GetWorkerNum()

unsigned int Nektar::Thread::ThreadManagerBoost::v_GetWorkerNum ( )
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 234 of file ThreadBoost.cpp.

235 {
236  boost::thread::id id = boost::this_thread::get_id();
237  return m_threadMap[id];
238 }

References m_threadMap.

◆ v_Hold()

void Nektar::Thread::ThreadManagerBoost::v_Hold ( )
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 293 of file ThreadBoost.cpp.

294 {
295  m_barrier->wait();
296 }

References m_barrier.

◆ v_InThread()

bool Nektar::Thread::ThreadManagerBoost::v_InThread ( )
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 198 of file ThreadBoost.cpp.

199 {
200  boost::thread::id id = boost::this_thread::get_id();
201  return (id != m_masterThreadId);
202 }

References m_masterThreadId.

◆ v_QueueJob()

void Nektar::Thread::ThreadManagerBoost::v_QueueJob ( ThreadJob job)
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 156 of file ThreadBoost.cpp.

157 {
158  Lock masterQueueLock(m_masterQueueMutex); // locks the queue
159  m_masterQueue.push(job);
160  m_masterQueueCondVar.notify_all(); // alert a waiting thread.
161 } // queue unlocked

References m_masterQueue, m_masterQueueCondVar, and m_masterQueueMutex.

◆ v_QueueJobs()

void Nektar::Thread::ThreadManagerBoost::v_QueueJobs ( std::vector< ThreadJob * > &  joblist)
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 144 of file ThreadBoost.cpp.

145 {
146  std::vector<ThreadJob *>::iterator it;
147  for (it = joblist.begin(); it < joblist.end(); ++it)
148  {
149  QueueJob(*it);
150  }
151 }
void QueueJob(ThreadJob *job)
Pass a single job to the master queue.
Definition: Thread.h:191

References Nektar::Thread::ThreadManager::QueueJob().

◆ v_SetChunkSize()

void Nektar::Thread::ThreadManagerBoost::v_SetChunkSize ( unsigned int  chnk)
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 180 of file ThreadBoost.cpp.

181 {
182  Lock masterQueueLock(m_masterQueueMutex); // locks the queue
183  m_chunkSize = std::max(chnk, 1U);
184 }

References m_chunkSize, and m_masterQueueMutex.

◆ v_SetNumWorkers() [1/2]

void Nektar::Thread::ThreadManagerBoost::v_SetNumWorkers ( )
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 277 of file ThreadBoost.cpp.

278 {
280 }
void SetNumWorkersImpl(const unsigned int num)

References m_numThreads, and SetNumWorkersImpl().

◆ v_SetNumWorkers() [2/2]

void Nektar::Thread::ThreadManagerBoost::v_SetNumWorkers ( const unsigned int  num)
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 266 of file ThreadBoost.cpp.

267 {
268  unsigned int n;
269  n = std::min(num, m_numThreads);
270  n = std::max(n, static_cast<unsigned int>(0));
272 }

References m_numThreads, and SetNumWorkersImpl().

◆ v_SetSchedType()

void Nektar::Thread::ThreadManagerBoost::v_SetSchedType ( SchedType  s)
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 189 of file ThreadBoost.cpp.

190 {
191  Lock masterQueueLock(m_masterQueueMutex); // locks the queue
192  m_schedType = s;
193 }

References m_masterQueueMutex, and m_schedType.

◆ v_Wait()

void Nektar::Thread::ThreadManagerBoost::v_Wait ( )
overrideprotectedvirtual

Implements Nektar::Thread::ThreadManager.

Definition at line 207 of file ThreadBoost.cpp.

208 {
209  bool working;
210  Lock masterQueueLock(m_masterQueueMutex); // locks the queue
211  working = IsWorking();
212  m_masterActiveCondVar.notify_all();
213  m_masterQueueCondVar.notify_all();
214  while (!m_masterQueue.empty() || working)
215  {
216  // while waiting, master queue is unlocked
217  m_masterQueueCondVar.wait(masterQueueLock);
218  // on exiting wait master queue is locked again
219  working = IsWorking();
220  }
221 }

References IsWorking(), m_masterActiveCondVar, m_masterQueue, m_masterQueueCondVar, and m_masterQueueMutex.

Friends And Related Function Documentation

◆ ThreadWorkerBoost

friend class ThreadWorkerBoost
friend

So the workers can access the master queue and locks.

Definition at line 63 of file ThreadBoost.h.

Referenced by ThreadManagerBoost().

Member Data Documentation

◆ className

std::string Nektar::Thread::ThreadManagerBoost::className
staticprivate
Initial value:
=
"ThreadManagerBoost", ThreadManagerBoost::Create,
"Threading using Boost.")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:198
static ThreadManagerSharedPtr Create(unsigned int numT)
Called by the factory method.
Definition: ThreadBoost.h:72
ThreadManagerFactory & GetThreadManagerFactory()
Definition: Thread.cpp:49

Definition at line 115 of file ThreadBoost.h.

◆ m_barrier

boost::barrier* Nektar::Thread::ThreadManagerBoost::m_barrier
private

Definition at line 113 of file ThreadBoost.h.

Referenced by SetNumWorkersImpl(), ThreadManagerBoost(), v_Hold(), and ~ThreadManagerBoost().

◆ m_chunkSize

unsigned int Nektar::Thread::ThreadManagerBoost::m_chunkSize
private

◆ m_masterActiveCondVar

boost::condition_variable Nektar::Thread::ThreadManagerBoost::m_masterActiveCondVar
private

◆ m_masterActiveMutex

boost::mutex Nektar::Thread::ThreadManagerBoost::m_masterActiveMutex
private

◆ m_masterQueue

std::queue<ThreadJob *> Nektar::Thread::ThreadManagerBoost::m_masterQueue
private

◆ m_masterQueueCondVar

boost::condition_variable Nektar::Thread::ThreadManagerBoost::m_masterQueueCondVar
private

◆ m_masterQueueMutex

boost::mutex Nektar::Thread::ThreadManagerBoost::m_masterQueueMutex
private

◆ m_masterThreadId

boost::thread::id Nektar::Thread::ThreadManagerBoost::m_masterThreadId
private

Definition at line 108 of file ThreadBoost.h.

Referenced by ThreadManagerBoost(), and v_InThread().

◆ m_numThreads

const unsigned int Nektar::Thread::ThreadManagerBoost::m_numThreads
private

◆ m_numWorkers

unsigned int Nektar::Thread::ThreadManagerBoost::m_numWorkers
private

◆ m_schedType

SchedType Nektar::Thread::ThreadManagerBoost::m_schedType
private

◆ m_threadActiveList

bool* Nektar::Thread::ThreadManagerBoost::m_threadActiveList
private

◆ m_threadBusyList

bool* Nektar::Thread::ThreadManagerBoost::m_threadBusyList
private

◆ m_threadList

ThreadWorkerBoost** Nektar::Thread::ThreadManagerBoost::m_threadList
private

Definition at line 106 of file ThreadBoost.h.

Referenced by ThreadManagerBoost(), and ~ThreadManagerBoost().

◆ m_threadMap

std::map<boost::thread::id, unsigned int> Nektar::Thread::ThreadManagerBoost::m_threadMap
private

Definition at line 114 of file ThreadBoost.h.

Referenced by ThreadManagerBoost(), and v_GetWorkerNum().

◆ m_threadThreadList

boost::thread** Nektar::Thread::ThreadManagerBoost::m_threadThreadList
private

Definition at line 107 of file ThreadBoost.h.

Referenced by ThreadManagerBoost(), and ~ThreadManagerBoost().

◆ m_type

std::string Nektar::Thread::ThreadManagerBoost::m_type
private

Definition at line 116 of file ThreadBoost.h.

Referenced by ThreadManagerBoost(), and v_GetType().