Geant4-11
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes
PTL::UserTaskQueue Class Reference

#include <UserTaskQueue.hh>

Inheritance diagram for PTL::UserTaskQueue:
PTL::VUserTaskQueue

Public Types

typedef std::atomic< intmax_t > AtomicInt
 
typedef std::function< void()> function_type
 
typedef std::uniform_int_distribution< int > int_dist_t
 
typedef std::default_random_engine random_engine_t
 
typedef uintmax_t size_type
 
typedef std::shared_ptr< VTasktask_pointer
 
typedef std::vector< TaskSubQueue * > TaskSubQueueContainer
 
typedef std::set< ThreadIdThreadIdSet
 

Public Member Functions

virtual bool bin_empty (size_type bin) const override
 
virtual size_type bin_size (size_type bin) const override
 
virtual VUserTaskQueueclone () override
 
virtual bool empty () const override
 
virtual void ExecuteOnAllThreads (ThreadPool *tp, function_type f) override
 
virtual void ExecuteOnSpecificThreads (ThreadIdSet tid_set, ThreadPool *tp, function_type f) override
 
virtual task_pointer GetTask (intmax_t subq=-1, intmax_t nitr=-1) override
 
virtual intmax_t GetThreadBin () const override
 
task_pointer GetThreadBinTask ()
 
virtual intmax_t InsertTask (task_pointer &&, ThreadData *=nullptr, intmax_t subq=-1) override PTL_NO_SANITIZE_THREAD
 
virtual void resize (intmax_t) override
 
virtual size_type size () const override
 
bool true_empty () const override
 
size_type true_size () const override
 
 UserTaskQueue (intmax_t nworkers=-1, UserTaskQueue *=nullptr)
 
virtual void Wait () override
 
intmax_t workers () const
 
virtual ~UserTaskQueue () override
 

Protected Member Functions

intmax_t GetInsertBin () const
 

Protected Attributes

intmax_t m_workers = 0
 

Private Member Functions

void AcquireHold ()
 
void ReleaseHold ()
 

Private Attributes

std::atomic_bool * m_hold
 
intmax_t m_insert_bin
 
bool m_is_clone
 
Mutexm_mutex
 
std::atomic_uintmax_t * m_ntasks
 
std::vector< int >::iterator m_rand_itr
 
std::vector< int > m_rand_list
 
TaskSubQueueContainerm_subqueues
 
intmax_t m_thread_bin
 

Detailed Description

Definition at line 47 of file UserTaskQueue.hh.

Member Typedef Documentation

◆ AtomicInt

typedef std::atomic<intmax_t> PTL::VUserTaskQueue::AtomicInt
inherited

Definition at line 51 of file VUserTaskQueue.hh.

◆ function_type

Definition at line 53 of file VUserTaskQueue.hh.

◆ int_dist_t

typedef std::uniform_int_distribution<int> PTL::UserTaskQueue::int_dist_t

Definition at line 53 of file UserTaskQueue.hh.

◆ random_engine_t

typedef std::default_random_engine PTL::UserTaskQueue::random_engine_t

Definition at line 52 of file UserTaskQueue.hh.

◆ size_type

typedef uintmax_t PTL::VUserTaskQueue::size_type
inherited

Definition at line 52 of file VUserTaskQueue.hh.

◆ task_pointer

typedef std::shared_ptr<VTask> PTL::UserTaskQueue::task_pointer

Definition at line 50 of file UserTaskQueue.hh.

◆ TaskSubQueueContainer

typedef std::vector<TaskSubQueue*> PTL::UserTaskQueue::TaskSubQueueContainer

Definition at line 51 of file UserTaskQueue.hh.

◆ ThreadIdSet

typedef std::set<ThreadId> PTL::VUserTaskQueue::ThreadIdSet
inherited

Definition at line 54 of file VUserTaskQueue.hh.

Constructor & Destructor Documentation

◆ UserTaskQueue()

UserTaskQueue::UserTaskQueue ( intmax_t  nworkers = -1,
UserTaskQueue parent = nullptr 
)

Definition at line 37 of file UserTaskQueue.cc.

38: VUserTaskQueue(nworkers)
39, m_is_clone((parent) ? true : false)
40, m_thread_bin((parent) ? (ThreadPool::get_this_thread_id() % (nworkers + 1)) : 0)
41, m_insert_bin((parent) ? (ThreadPool::get_this_thread_id() % (nworkers + 1)) : 0)
42, m_hold((parent) ? parent->m_hold : new std::atomic_bool(false))
43, m_ntasks((parent) ? parent->m_ntasks : new std::atomic_uintmax_t(0))
44, m_subqueues((parent) ? parent->m_subqueues : new TaskSubQueueContainer())
45{
46 // create nthreads + 1 subqueues so there is always a subqueue available
47 if(!parent)
48 {
49 for(intmax_t i = 0; i < nworkers + 1; ++i)
50 m_subqueues->emplace_back(new TaskSubQueue(m_ntasks));
51 }
52
53#if defined(DEBUG)
54 if(GetEnv<int>("PTL_VERBOSE", 0) > 3)
55 {
56 RecursiveAutoLock l(TypeMutex<decltype(std::cout), RecursiveMutex>());
57 std::stringstream ss;
58 ss << ThreadPool::get_this_thread_id() << "> " << ThisThread::get_id() << " ["
59 << __FUNCTION__ << ":" << __LINE__ << "] "
60 << "this = " << this << ", "
61 << "clone = " << std::boolalpha << m_is_clone << ", "
62 << "thread = " << m_thread_bin << ", "
63 << "insert = " << m_insert_bin << ", "
64 << "hold = " << m_hold->load() << " @ " << m_hold << ", "
65 << "tasks = " << m_ntasks->load() << " @ " << m_ntasks << ", "
66 << "subqueue = " << m_subqueues << ", "
67 << "size = " << true_size() << ", "
68 << "empty = " << true_empty();
69 std::cout << ss.str() << std::endl;
70 }
71#endif
72}
static uintmax_t get_this_thread_id()
Definition: ThreadPool.cc:122
std::atomic_uintmax_t * m_ntasks
std::vector< TaskSubQueue * > TaskSubQueueContainer
std::atomic_bool * m_hold
TaskSubQueueContainer * m_subqueues
bool true_empty() const override
size_type true_size() const override
VUserTaskQueue(intmax_t nworkers=-1)
std::recursive_mutex RecursiveMutex
Definition: Threading.hh:78
MutexTp & TypeMutex(const unsigned int &_n=0)
Definition: Threading.hh:119

References PTL::ThreadPool::get_this_thread_id(), m_hold, m_insert_bin, m_is_clone, m_ntasks, m_subqueues, m_thread_bin, true_empty(), true_size(), and PTL::TypeMutex().

Referenced by clone().

◆ ~UserTaskQueue()

UserTaskQueue::~UserTaskQueue ( )
overridevirtual

Definition at line 76 of file UserTaskQueue.cc.

77{
78 if(!m_is_clone)
79 {
80 for(auto& itr : *m_subqueues)
81 {
82 assert(itr->empty());
83 delete itr;
84 }
85 m_subqueues->clear();
86 delete m_hold;
87 delete m_ntasks;
88 delete m_subqueues;
89 }
90}

References m_hold, m_is_clone, m_ntasks, and m_subqueues.

Member Function Documentation

◆ AcquireHold()

void UserTaskQueue::AcquireHold ( )
private

Definition at line 434 of file UserTaskQueue.cc.

435{
436 bool _hold;
437 while(!(_hold = m_hold->load(std::memory_order_relaxed)))
438 {
439 m_hold->compare_exchange_strong(_hold, true, std::memory_order_release,
440 std::memory_order_relaxed);
441 }
442}

References m_hold.

Referenced by ExecuteOnAllThreads(), and ExecuteOnSpecificThreads().

◆ bin_empty()

bool PTL::UserTaskQueue::bin_empty ( size_type  bin) const
inlineoverridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 146 of file UserTaskQueue.hh.

147{
148 return (*m_subqueues)[bin]->empty();
149}

◆ bin_size()

PTL::UserTaskQueue::size_type PTL::UserTaskQueue::bin_size ( size_type  bin) const
inlineoverridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 138 of file UserTaskQueue.hh.

139{
140 return (*m_subqueues)[bin]->size();
141}

◆ clone()

VUserTaskQueue * UserTaskQueue::clone ( )
overridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 120 of file UserTaskQueue.cc.

121{
122 return new UserTaskQueue(workers(), this);
123}
UserTaskQueue(intmax_t nworkers=-1, UserTaskQueue *=nullptr)
intmax_t workers() const

References UserTaskQueue(), and PTL::VUserTaskQueue::workers().

◆ empty()

bool PTL::UserTaskQueue::empty ( ) const
inlineoverridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 122 of file UserTaskQueue.hh.

123{
124 return (m_ntasks->load(std::memory_order_relaxed) == 0);
125}

References m_ntasks.

◆ ExecuteOnAllThreads()

void UserTaskQueue::ExecuteOnAllThreads ( ThreadPool tp,
function_type  f 
)
overridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 305 of file UserTaskQueue.cc.

306{
307 using task_group_type = TaskGroup<int, int>;
308 using thread_execute_map_t = std::map<int64_t, bool>;
309
310 if(!tp->is_alive())
311 {
312 func();
313 return;
314 }
315
316 task_group_type tg{ [](int& ref, int i) { return (ref += i); }, tp };
317
318 // wait for all threads to finish any work
319 // NOTE: will cause deadlock if called from a task
320 while(tp->get_active_threads_count() > 0)
321 ThisThread::sleep_for(std::chrono::milliseconds(10));
322
323 thread_execute_map_t thread_execute_map{};
324 std::vector<std::shared_ptr<VTask>> _tasks{};
325 _tasks.reserve(m_workers + 1);
326
327 AcquireHold();
328 for(int i = 0; i < (m_workers + 1); ++i)
329 {
330 if(i == GetThreadBin())
331 continue;
332
333 //--------------------------------------------------------------------//
334 auto thread_specific_func = [&]() {
335 ScopeDestructor _dtor = tg.get_scope_destructor();
336 static Mutex _mtx;
337 _mtx.lock();
338 bool& _executed = thread_execute_map[GetThreadBin()];
339 _mtx.unlock();
340 if(!_executed)
341 {
342 func();
343 _executed = true;
344 return 1;
345 }
346 return 0;
347 };
348 //--------------------------------------------------------------------//
349
350 InsertTask(tg.wrap(thread_specific_func), ThreadData::GetInstance(), i);
351 }
352
353 tp->notify_all();
354 int nexecuted = tg.join();
355 if(nexecuted != m_workers)
356 {
357 std::stringstream msg;
358 msg << "Failure executing routine on all threads! Only " << nexecuted
359 << " threads executed function out of " << m_workers << " workers";
360 std::cerr << msg.str() << std::endl;
361 }
362 ReleaseHold();
363}
static ThreadData *& GetInstance()
Definition: ThreadData.cc:35
virtual intmax_t GetThreadBin() const override
virtual intmax_t InsertTask(task_pointer &&, ThreadData *=nullptr, intmax_t subq=-1) override PTL_NO_SANITIZE_THREAD
std::mutex Mutex
Definition: Threading.hh:77

References AcquireHold(), PTL::ThreadData::GetInstance(), GetThreadBin(), InsertTask(), PTL::VUserTaskQueue::m_workers, ReleaseHold(), and G4InuclParticleNames::tp.

◆ ExecuteOnSpecificThreads()

void UserTaskQueue::ExecuteOnSpecificThreads ( ThreadIdSet  tid_set,
ThreadPool tp,
function_type  f 
)
overridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 368 of file UserTaskQueue.cc.

370{
371 using task_group_type = TaskGroup<int, int>;
372 using thread_execute_map_t = std::map<int64_t, bool>;
373
374 task_group_type tg{ [](int& ref, int i) { return (ref += i); }, tp };
375
376 // wait for all threads to finish any work
377 // NOTE: will cause deadlock if called from a task
378 while(tp->get_active_threads_count() > 0)
379 ThisThread::sleep_for(std::chrono::milliseconds(10));
380
381 if(!tp->is_alive())
382 {
383 func();
384 return;
385 }
386
387 thread_execute_map_t thread_execute_map{};
388
389 //========================================================================//
390 // wrap the function so that it will only be executed if the thread
391 // has an ID in the set
392 auto thread_specific_func = [&]() {
393 ScopeDestructor _dtor = tg.get_scope_destructor();
394 static Mutex _mtx;
395 _mtx.lock();
396 bool& _executed = thread_execute_map[GetThreadBin()];
397 _mtx.unlock();
398 if(!_executed && tid_set.count(ThisThread::get_id()) > 0)
399 {
400 func();
401 _executed = true;
402 return 1;
403 }
404 return 0;
405 };
406 //========================================================================//
407
408 if(tid_set.count(ThisThread::get_id()) > 0)
409 func();
410
411 AcquireHold();
412 for(int i = 0; i < (m_workers + 1); ++i)
413 {
414 if(i == GetThreadBin())
415 continue;
416
417 InsertTask(tg.wrap(thread_specific_func), ThreadData::GetInstance(), i);
418 }
419 tp->notify_all();
420 decltype(tid_set.size()) nexecuted = tg.join();
421 if(nexecuted != tid_set.size())
422 {
423 std::stringstream msg;
424 msg << "Failure executing routine on specific threads! Only " << nexecuted
425 << " threads executed function out of " << tid_set.size() << " workers";
426 std::cerr << msg.str() << std::endl;
427 }
428 ReleaseHold();
429}

References AcquireHold(), PTL::ThreadData::GetInstance(), GetThreadBin(), InsertTask(), PTL::VUserTaskQueue::m_workers, ReleaseHold(), and G4InuclParticleNames::tp.

◆ GetInsertBin()

intmax_t UserTaskQueue::GetInsertBin ( ) const
protected

Definition at line 138 of file UserTaskQueue.cc.

139{
140 return (++m_insert_bin % (m_workers + 1));
141}

References m_insert_bin, and PTL::VUserTaskQueue::m_workers.

Referenced by InsertTask().

◆ GetTask()

UserTaskQueue::task_pointer UserTaskQueue::GetTask ( intmax_t  subq = -1,
intmax_t  nitr = -1 
)
overridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 180 of file UserTaskQueue.cc.

181{
182 // exit if empty
183 if(this->true_empty())
184 return nullptr;
185
186 // ensure the thread has a bin assignment
187 intmax_t tbin = GetThreadBin();
188 intmax_t n = (subq < 0) ? tbin : subq;
189 if(nitr < 1)
190 nitr = (m_workers + 1); // * m_ntasks->load(std::memory_order_relaxed);
191
192 if(m_hold->load(std::memory_order_relaxed))
193 {
194 return GetThreadBinTask();
195 }
196
197 task_pointer _task = nullptr;
198 //------------------------------------------------------------------------//
199 auto get_task = [&](intmax_t _n) {
200 TaskSubQueue* task_subq = (*m_subqueues)[_n % (m_workers + 1)];
201 // try to acquire a claim for the bin
202 // if acquired, no other threads will access bin until claim is released
203 if(!task_subq->empty() && task_subq->AcquireClaim())
204 {
205 // pop task out of bin
206 _task = task_subq->PopTask(n == tbin);
207 // release the claim on the bin
208 task_subq->ReleaseClaim();
209 }
210 if(_task)
211 --(*m_ntasks);
212 // return success if valid pointer
213 return (_task != nullptr);
214 };
215 //------------------------------------------------------------------------//
216
217 // there are num_workers+1 bins so there is always a bin that is open
218 // execute num_workers+2 iterations so the thread checks its bin twice
219 // while(!empty())
220 {
221 for(intmax_t i = 0; i < nitr; ++i, ++n)
222 {
223 if(get_task(n % (m_workers + 1)))
224 return _task;
225 }
226 }
227
228 // only reached if looped over all bins (and looked in own bin twice)
229 // and found no work so return an empty task and the thread will be put to
230 // sleep if there is still no work by the time it reaches its
231 // condition variable
232 return _task;
233}
task_pointer GetThreadBinTask()
std::shared_ptr< VTask > task_pointer

References GetThreadBin(), GetThreadBinTask(), m_hold, PTL::VUserTaskQueue::m_workers, CLHEP::detail::n, and true_empty().

◆ GetThreadBin()

intmax_t UserTaskQueue::GetThreadBin ( ) const
overridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 127 of file UserTaskQueue.cc.

128{
129 // get a thread id number
130 static thread_local intmax_t tl_bin =
132 return tl_bin;
133}

References PTL::ThreadPool::get_this_thread_id(), m_thread_bin, and PTL::VUserTaskQueue::m_workers.

Referenced by ExecuteOnAllThreads(), ExecuteOnSpecificThreads(), GetTask(), GetThreadBinTask(), and InsertTask().

◆ GetThreadBinTask()

UserTaskQueue::task_pointer UserTaskQueue::GetThreadBinTask ( )

Definition at line 146 of file UserTaskQueue.cc.

147{
148 intmax_t tbin = GetThreadBin();
149 TaskSubQueue* task_subq = (*m_subqueues)[tbin % (m_workers + 1)];
150 task_pointer _task = nullptr;
151
152 //------------------------------------------------------------------------//
153 auto get_task = [&]() {
154 if(task_subq->AcquireClaim())
155 {
156 // run task
157 _task = task_subq->PopTask(true);
158 // release the claim on the bin
159 task_subq->ReleaseClaim();
160 }
161 if(_task)
162 --(*m_ntasks);
163 // return success if valid pointer
164 return (_task != nullptr);
165 };
166 //------------------------------------------------------------------------//
167
168 // while not empty
169 while(!task_subq->empty())
170 {
171 if(get_task())
172 break;
173 }
174 return _task;
175}

References GetThreadBin(), and PTL::VUserTaskQueue::m_workers.

Referenced by GetTask().

◆ InsertTask()

intmax_t UserTaskQueue::InsertTask ( task_pointer &&  task,
ThreadData data = nullptr,
intmax_t  subq = -1 
)
overridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 238 of file UserTaskQueue.cc.

239{
240 // increment number of tasks
241 ++(*m_ntasks);
242
243 bool spin = m_hold->load(std::memory_order_relaxed);
244 intmax_t tbin = GetThreadBin();
245
246 if(data && data->within_task)
247 {
248 subq = tbin;
249 // spin = true;
250 }
251
252 // subq is -1 unless specified so unless specified
253 // GetInsertBin() call increments a counter and returns
254 // counter % (num_workers + 1) so that tasks are distributed evenly
255 // among the bins
256 intmax_t n = (subq < 0) ? GetInsertBin() : subq;
257
258 //------------------------------------------------------------------------//
259 auto insert_task = [&](intmax_t _n) {
260 TaskSubQueue* task_subq = (*m_subqueues)[_n];
261 // TaskSubQueue* next_subq = (*m_subqueues)[(_n + 1) % (m_workers + 1)];
262 // if not threads bin and size difference, insert into smaller
263 // if(n != tbin && next_subq->size() < task_subq->size())
264 // task_subq = next_subq;
265 // try to acquire a claim for the bin
266 // if acquired, no other threads will access bin until claim is released
267 if(task_subq->AcquireClaim())
268 {
269 // push the task into the bin
270 task_subq->PushTask(std::move(task));
271 // release the claim on the bin
272 task_subq->ReleaseClaim();
273 // return success
274 return true;
275 }
276 return false;
277 };
278 //------------------------------------------------------------------------//
279
280 // if not in "hold/spin mode", where thread only inserts tasks into
281 // specified bin, then move onto next bin
282 //
283 if(spin)
284 {
285 n = n % (m_workers + 1);
286 while(!insert_task(n))
287 ;
288 return n;
289 }
290
291 // there are num_workers+1 bins so there is always a bin that is open
292 // execute num_workers+2 iterations so the thread checks its bin twice
293 while(true)
294 {
295 auto _n = (n++) % (m_workers + 1);
296 if(insert_task(_n))
297 return _n;
298 }
299 return GetThreadBin();
300}
intmax_t GetInsertBin() const

References GetInsertBin(), GetThreadBin(), m_hold, PTL::VUserTaskQueue::m_workers, CLHEP::detail::n, and PTL::ThreadData::within_task.

Referenced by ExecuteOnAllThreads(), and ExecuteOnSpecificThreads().

◆ ReleaseHold()

void UserTaskQueue::ReleaseHold ( )
private

Definition at line 447 of file UserTaskQueue.cc.

448{
449 bool _hold;
450 while((_hold = m_hold->load(std::memory_order_relaxed)))
451 {
452 m_hold->compare_exchange_strong(_hold, false, std::memory_order_release,
453 std::memory_order_relaxed);
454 }
455}

References m_hold.

Referenced by ExecuteOnAllThreads(), and ExecuteOnSpecificThreads().

◆ resize()

void UserTaskQueue::resize ( intmax_t  n)
overridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 95 of file UserTaskQueue.cc.

96{
98 if(m_workers < n)
99 {
100 while(m_workers < n)
101 {
102 m_subqueues->emplace_back(new TaskSubQueue(m_ntasks));
103 ++m_workers;
104 }
105 }
106 else if(m_workers > n)
107 {
108 while(m_workers > n)
109 {
110 delete m_subqueues->back();
111 m_subqueues->pop_back();
112 --m_workers;
113 }
114 }
115}

References m_mutex, m_ntasks, m_subqueues, PTL::VUserTaskQueue::m_workers, and CLHEP::detail::n.

◆ size()

PTL::UserTaskQueue::size_type PTL::UserTaskQueue::size ( ) const
inlineoverridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 130 of file UserTaskQueue.hh.

131{
132 return m_ntasks->load(std::memory_order_relaxed);
133}

◆ true_empty()

bool PTL::UserTaskQueue::true_empty ( ) const
inlineoverridevirtual

Reimplemented from PTL::VUserTaskQueue.

Definition at line 154 of file UserTaskQueue.hh.

155{
156 for(const auto& itr : *m_subqueues)
157 if(!itr->empty())
158 return false;
159 return true;
160}

Referenced by GetTask(), and UserTaskQueue().

◆ true_size()

PTL::UserTaskQueue::size_type PTL::UserTaskQueue::true_size ( ) const
inlineoverridevirtual

Reimplemented from PTL::VUserTaskQueue.

Definition at line 165 of file UserTaskQueue.hh.

166{
167 size_type _n = 0;
168 for(const auto& itr : *m_subqueues)
169 _n += itr->size();
170 return _n;
171}

Referenced by UserTaskQueue().

◆ Wait()

virtual void PTL::UserTaskQueue::Wait ( )
inlineoverridevirtual

Implements PTL::VUserTaskQueue.

Definition at line 73 of file UserTaskQueue.hh.

73{}

◆ workers()

intmax_t PTL::VUserTaskQueue::workers ( ) const
inlineinherited

Definition at line 104 of file VUserTaskQueue.hh.

104{ return m_workers; }

References PTL::VUserTaskQueue::m_workers.

Referenced by clone().

Field Documentation

◆ m_hold

std::atomic_bool* PTL::UserTaskQueue::m_hold
private

◆ m_insert_bin

intmax_t PTL::UserTaskQueue::m_insert_bin
mutableprivate

Definition at line 104 of file UserTaskQueue.hh.

Referenced by GetInsertBin(), and UserTaskQueue().

◆ m_is_clone

bool PTL::UserTaskQueue::m_is_clone
private

Definition at line 102 of file UserTaskQueue.hh.

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

◆ m_mutex

Mutex* PTL::UserTaskQueue::m_mutex
private

Definition at line 107 of file UserTaskQueue.hh.

Referenced by resize().

◆ m_ntasks

std::atomic_uintmax_t* PTL::UserTaskQueue::m_ntasks
private

Definition at line 106 of file UserTaskQueue.hh.

Referenced by empty(), resize(), UserTaskQueue(), and ~UserTaskQueue().

◆ m_rand_itr

std::vector<int>::iterator PTL::UserTaskQueue::m_rand_itr
private

Definition at line 110 of file UserTaskQueue.hh.

◆ m_rand_list

std::vector<int> PTL::UserTaskQueue::m_rand_list
private

Definition at line 109 of file UserTaskQueue.hh.

◆ m_subqueues

TaskSubQueueContainer* PTL::UserTaskQueue::m_subqueues
private

Definition at line 108 of file UserTaskQueue.hh.

Referenced by resize(), UserTaskQueue(), and ~UserTaskQueue().

◆ m_thread_bin

intmax_t PTL::UserTaskQueue::m_thread_bin
private

Definition at line 103 of file UserTaskQueue.hh.

Referenced by GetThreadBin(), and UserTaskQueue().

◆ m_workers

intmax_t PTL::VUserTaskQueue::m_workers = 0
protectedinherited

The documentation for this class was generated from the following files: