OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
Public Types | Public Member Functions | Protected Attributes | List of all members
ossimJobMultiThreadQueue Class Reference

This allocates a thread pool used to listen on a shared job queue. More...

#include <ossimJobMultiThreadQueue.h>

Public Types

typedef std::vector< std::shared_ptr< ossimJobThreadQueue > > ThreadQueueList
 

Public Member Functions

 ossimJobMultiThreadQueue (std::shared_ptr< ossimJobQueue > q=0, ossim_uint32 nThreads=0)
 allows one to create a pool of threads with a shared job queue More...
 
virtual ~ossimJobMultiThreadQueue ()
 Will cancel all threads and wait for completion and clear the thread queue list. More...
 
std::shared_ptr< ossimJobQueuegetJobQueue ()
 
const std::shared_ptr< ossimJobQueuegetJobQueue () const
 
void setJobQueue (std::shared_ptr< ossimJobQueue > q)
 set the job queue to all threads More...
 
void setNumberOfThreads (ossim_uint32 nThreads)
 Will set the number of threads. More...
 
ossim_uint32 getNumberOfThreads () const
 
ossim_uint32 numberOfBusyThreads () const
 
bool areAllThreadsBusy () const
 
bool hasJobsToProcess () const
 
void cancel ()
 Allows one to cancel all threads. More...
 
void waitForCompletion ()
 Allows on to wait for all thread completions. More...
 

Protected Attributes

std::mutex m_mutex
 
std::shared_ptr< ossimJobQueuem_jobQueue
 
ThreadQueueList m_threadQueueList
 

Detailed Description

This allocates a thread pool used to listen on a shared job queue.

#include <memory>
#include <iostream>
class TestJob : public ossimJob
{
public:
TestJob(){}
protected:
virtual void run()
{
}
};
class MyCallback : public ossimJobCallback
{
public:
MyCallback(){}
virtual void started(std::shared_ptr<ossimJob> job)
{
std::cout << "Started job\n";
}
virtual void finished(std::shared_ptr<ossimJob> job)
{
std::cout << "Finished job\n";
}
};
int main(int argc, char *argv[])
{
int nThreads = 5;
int nJobs = 10;
std::shared_ptr<ossimJobQueue> jobQueue = std::make_shared<ossimJobQueue>();
std::shared_ptr<ossimJobMultiThreadQueue> jobThreadQueue = std::make_shared<ossimJobMultiThreadQueue>(jobQueue, nThreads);
for(int i = 0; i < nJobs; ++i)
{
std::shared_ptr<TestJob> job = std::make_shared<TestJob>();
job->setCallback(std::make_shared<MyCallback>());
jobQueue->add(job);
}
while(jobThreadQueue->hasJobsToProcess())
{
}
std::cout << "Finished and cancelling thread queue\n";
jobThreadQueue->cancel();
jobThreadQueue->waitForCompletion();
return 0;
}

Definition at line 69 of file ossimJobMultiThreadQueue.h.

Member Typedef Documentation

◆ ThreadQueueList

typedef std::vector<std::shared_ptr<ossimJobThreadQueue> > ossimJobMultiThreadQueue::ThreadQueueList

Definition at line 72 of file ossimJobMultiThreadQueue.h.

Constructor & Destructor Documentation

◆ ossimJobMultiThreadQueue()

ossimJobMultiThreadQueue::ossimJobMultiThreadQueue ( std::shared_ptr< ossimJobQueue q = 0,
ossim_uint32  nThreads = 0 
)

allows one to create a pool of threads with a shared job queue

Definition at line 3 of file ossimJobMultiThreadQueue.cpp.

References setNumberOfThreads().

5 :m_jobQueue(q?q:std::make_shared<ossimJobQueue>())
6 {
7  setNumberOfThreads(nThreads);
8 }
void setNumberOfThreads(ossim_uint32 nThreads)
Will set the number of threads.
std::shared_ptr< ossimJobQueue > m_jobQueue

◆ ~ossimJobMultiThreadQueue()

ossimJobMultiThreadQueue::~ossimJobMultiThreadQueue ( )
virtual

Will cancel all threads and wait for completion and clear the thread queue list.

Definition at line 10 of file ossimJobMultiThreadQueue.cpp.

References cancel(), m_threadQueueList, and waitForCompletion().

11 {
12  cancel();
14  m_threadQueueList.clear();
15 }
void cancel()
Allows one to cancel all threads.
void waitForCompletion()
Allows on to wait for all thread completions.

Member Function Documentation

◆ areAllThreadsBusy()

bool ossimJobMultiThreadQueue::areAllThreadsBusy ( ) const
Returns
true if all threads are busy and false otherwise

Definition at line 82 of file ossimJobMultiThreadQueue.cpp.

References m_mutex, and m_threadQueueList.

83 {
84  std::lock_guard<std::mutex> lock(m_mutex);
85  ossim_uint32 idx = 0;
86  ossim_uint32 queueSize = m_threadQueueList.size();
87  for(idx = 0; idx < queueSize;++idx)
88  {
89  if(!m_threadQueueList[idx]->isProcessingJob()) return false;
90  }
91 
92  return true;
93 }
unsigned int ossim_uint32

◆ cancel()

void ossimJobMultiThreadQueue::cancel ( )

Allows one to cancel all threads.

Definition at line 111 of file ossimJobMultiThreadQueue.cpp.

References m_threadQueueList.

Referenced by ~ossimJobMultiThreadQueue().

112 {
113  for(auto thread:m_threadQueueList)
114  {
115  thread->cancel();
116  }
117 }

◆ getJobQueue() [1/2]

std::shared_ptr< ossimJobQueue > ossimJobMultiThreadQueue::getJobQueue ( )
Returns
the job queue

Definition at line 17 of file ossimJobMultiThreadQueue.cpp.

References m_jobQueue, and m_mutex.

18 {
19  std::lock_guard<std::mutex> lock(m_mutex);
20  return m_jobQueue;
21 }
std::shared_ptr< ossimJobQueue > m_jobQueue

◆ getJobQueue() [2/2]

const std::shared_ptr< ossimJobQueue > ossimJobMultiThreadQueue::getJobQueue ( ) const
Returns
the job queue

Definition at line 22 of file ossimJobMultiThreadQueue.cpp.

References m_jobQueue, and m_mutex.

23 {
24  std::lock_guard<std::mutex> lock(m_mutex);
25  return m_jobQueue;
26 }
std::shared_ptr< ossimJobQueue > m_jobQueue

◆ getNumberOfThreads()

ossim_uint32 ossimJobMultiThreadQueue::getNumberOfThreads ( ) const
Returns
the number of threads

Definition at line 63 of file ossimJobMultiThreadQueue.cpp.

References m_mutex, and m_threadQueueList.

64 {
65  std::lock_guard<std::mutex> lock(m_mutex);
66  return static_cast<ossim_uint32>( m_threadQueueList.size() );
67 }
unsigned int ossim_uint32

◆ hasJobsToProcess()

bool ossimJobMultiThreadQueue::hasJobsToProcess ( ) const
Returns
true if it has jobs that it's processing

Definition at line 95 of file ossimJobMultiThreadQueue.cpp.

References m_mutex, and m_threadQueueList.

96 {
97  bool result = false;
98  {
99  std::lock_guard<std::mutex> lock(m_mutex);
100  ossim_uint32 queueSize = m_threadQueueList.size();
101  ossim_uint32 idx = 0;
102  for(idx = 0; ((idx<queueSize)&&!result);++idx)
103  {
104  result = m_threadQueueList[idx]->hasJobsToProcess();
105  }
106  }
107 
108  return result;
109 }
unsigned int ossim_uint32

◆ numberOfBusyThreads()

ossim_uint32 ossimJobMultiThreadQueue::numberOfBusyThreads ( ) const
Returns
the number of threads that are busy

Definition at line 69 of file ossimJobMultiThreadQueue.cpp.

References m_mutex, and m_threadQueueList.

70 {
71  ossim_uint32 result = 0;
72  std::lock_guard<std::mutex> lock(m_mutex);
73  ossim_uint32 idx = 0;
74  ossim_uint32 queueSize = m_threadQueueList.size();
75  for(idx = 0; idx < queueSize;++idx)
76  {
77  if(m_threadQueueList[idx]->isProcessingJob()) ++result;
78  }
79  return result;
80 }
unsigned int ossim_uint32

◆ setJobQueue()

void ossimJobMultiThreadQueue::setJobQueue ( std::shared_ptr< ossimJobQueue q)

set the job queue to all threads

Parameters
qthe job queue to set

Definition at line 27 of file ossimJobMultiThreadQueue.cpp.

References m_jobQueue, m_mutex, and m_threadQueueList.

28 {
29  std::lock_guard<std::mutex> lock(m_mutex);
30  ossim_uint32 idx = 0;
31  m_jobQueue = q;
32  for(idx = 0; idx < m_threadQueueList.size(); ++idx)
33  {
34  m_threadQueueList[idx]->setJobQueue(m_jobQueue);
35  }
36 }
unsigned int ossim_uint32
std::shared_ptr< ossimJobQueue > m_jobQueue

◆ setNumberOfThreads()

void ossimJobMultiThreadQueue::setNumberOfThreads ( ossim_uint32  nThreads)

Will set the number of threads.

Definition at line 37 of file ossimJobMultiThreadQueue.cpp.

References m_jobQueue, m_mutex, and m_threadQueueList.

Referenced by ossimJobMultiThreadQueue().

38 {
39  std::lock_guard<std::mutex> lock(m_mutex);
40  ossim_uint32 idx = 0;
41  ossim_uint32 queueSize = m_threadQueueList.size();
42 
43  if(nThreads > queueSize)
44  {
45  for(idx = queueSize; idx < nThreads;++idx)
46  {
47  std::shared_ptr<ossimJobThreadQueue> threadQueue = std::make_shared<ossimJobThreadQueue>();
48  threadQueue->setJobQueue(m_jobQueue);
49  m_threadQueueList.push_back(threadQueue);
50  }
51  }
52  else if(nThreads < queueSize)
53  {
54  ThreadQueueList::iterator iter = m_threadQueueList.begin()+nThreads;
55  while(iter != m_threadQueueList.end())
56  {
57  (*iter)->cancel();
58  iter = m_threadQueueList.erase(iter);
59  }
60  }
61 }
unsigned int ossim_uint32
std::shared_ptr< ossimJobQueue > m_jobQueue

◆ waitForCompletion()

void ossimJobMultiThreadQueue::waitForCompletion ( )

Allows on to wait for all thread completions.

Usually called after

See also
cancel

Definition at line 119 of file ossimJobMultiThreadQueue.cpp.

References m_threadQueueList.

Referenced by ~ossimJobMultiThreadQueue().

120 {
121  for(auto thread:m_threadQueueList)
122  {
123  thread->waitForCompletion();
124  }
125 }

Member Data Documentation

◆ m_jobQueue

std::shared_ptr<ossimJobQueue> ossimJobMultiThreadQueue::m_jobQueue
protected

Definition at line 140 of file ossimJobMultiThreadQueue.h.

Referenced by getJobQueue(), setJobQueue(), and setNumberOfThreads().

◆ m_mutex

std::mutex ossimJobMultiThreadQueue::m_mutex
mutableprotected

◆ m_threadQueueList

ThreadQueueList ossimJobMultiThreadQueue::m_threadQueueList
protected

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