Thread¶
class Thread¶
- 
class paddle::Thread¶
- A simple wrapper for std::thread - Subclassed by paddle::SocketServer, paddle::SocketWorker, paddle::ThreadWorker - Public Functions - 
Thread()¶
- Construct Function. Default thread pointer is null. 
 - 
virtual ~Thread()¶
 - 
void detach()¶
- Detach the thread. It don’t need to be waited until it finish. 
 - 
void join()¶
- Join the thread. It should be waited until it finish. 
 - 
virtual void run() = 0¶
- Define what to be done on this thread through override this function. 
 - Protected Attributes - 
std::unique_ptr<std::thread> thread_¶
 
- 
class ThreadWorker¶
- 
class paddle::ThreadWorker¶
- ThreadWorker maintains a job queue. It executes the jobs in the job queue sequentianlly in a separate thread. - Use addJob() to add a new job to the job queue. - Inherits from paddle::Thread - Public Types - 
typedef std::function<void()> JobFunc¶
 - Public Functions - 
ThreadWorker()¶
- Construct Function. Default size of job queue is 0 and not stopping. 
 - 
~ThreadWorker()¶
- Destruct Function. If it’s running, wait until all job finish and then stop it. 
 - 
void stop()¶
- Finish current running job and quit the thread. 
 - 
void wait()¶
- Wait until all jobs was done (the job queue was empty). 
 - Protected Functions - 
virtual void run()¶
- Execute jobs in the job queue sequentianlly,. - Note
- If finish all the jobs in the job queue, notifies all the waiting threads the job queue was empty.
 
 
- 
typedef std::function<void()> 
class SyncThreadPool¶
- 
class paddle::SyncThreadPool¶
- SyncThreadPool maintains a pool of threads. It executes the job use all workers in the pool. - Use exec() to run a new job, job complete when exec returned. Only one job can exec simultaneously. - Each worker has an tid whose range is [0, getNumThreads()). JobFunc can use tid to divide input data. - Public Types - 
typedef std::function<void(int tid, size_t numThreads)> JobFunc¶
 - Public Functions - 
SyncThreadPool()¶
- Construct Function. No thread will be created. 
 - 
SyncThreadPool(size_t numWorkers, bool checkOwner = true)¶
- Construct Fucntion. Create numWorkers of threads in the pool. - Parameters
- numWorkers-- Number of the workers in the pool. 
- checkOwner-- Default true. If checkOwner is true, this sync thread pool should be used by it’s owner thread. 
 
 
 - 
~SyncThreadPool()¶
 - 
size_t getNumThreads()¶
- Return num of threads in the pool. 
 - 
void exec(JobFunc jobFunc, JobFunc ownerFunc = nullptr)¶
- Execute a job using all the theads in the pool. - Note
- For the ownerFunc, tid=getNumThreads().
- Parameters
- jobFunc-- The function to be executed. 
- ownerFunc-- Owner thread can do something in owerFunc when job executing. 
 
 
 - 
void execPlusOwner(JobFunc jobFunc)¶
- Execute a job using all the threads in the pool. And the owner thread will do the same job. - Note
- Assume that JobFunc will execute numThread + 1 times, with tid ranging [0,numThread]. The thread whose tid is numThread is the owner thread.
- Parameters
- jobFunc-- The job to be executed. 
 
 
 - Public Static Functions - 
static void execHelper(SyncThreadPool *pool, JobFunc jobFunc)¶
- Execute a job if has pool, else use caller thread as a worker. - Parameters
- pool-- The pool to execute the job. 
- jobFunc-- The job to be excuted. 
 
 
 - Protected Functions - 
void stop()¶
- Stop all the workers in the pool. 
 - 
void run(int tid)¶
- Execute the jobFunc_ using the worker thread tid, if not stopping. 
 - Protected Attributes - 
pid_t ownerThreadId_¶
 - 
bool stopping_¶
 - 
ThreadBarrier jobStartBarrier_¶
 - 
ThreadBarrier jobFinishBarrier_¶
 - 
bool checkOwner_¶
 - 
std::vector<std::unique_ptr<std::thread>> workers_¶
 
- 
typedef std::function<void(int tid, size_t numThreads)> 
class MultiThreadWorker¶
- template <class T>
- 
class paddle::MultiThreadWorker¶
- MultiThreadWorker maintains a job queue and a result queue. It executes the jobs in the job queue and puts the results into the result queue sequentially in multi separate threads. - Add jobs: - Use addJob() to add a new job to the job queue (the user added jobs should not return nullptr). - Use stopAddJob() to stop adding new jobs to the job queue (addJob() can not be called after stopAddJob()). - Normal stop: - Use waitResult() to get the results until nullptr is returned. Use stop() to exit normally (stopAddJob() should be called first). - Force stop: - Use forceStop() to exit forcibly even though there are remaining jobs in the job queue. - Public Types - 
typedef T ResultType¶
 - 
typedef std::shared_ptr<ResultType> ResultPtrType¶
 - 
typedef std::function<ResultPtrType()> JobFunc¶
 - Public Functions - 
MultiThreadWorker(size_t workerNum, size_t queueCapacity)¶
- Construct Function. Initialize the multithread worker. - Parameters
- workerNum-- Number of the workers. 
- queueCapacity-- Capapcity of the result queue. 
 
 
 - 
virtual ~MultiThreadWorker()¶
- Destruct Function. Force stop the workers even though there are remaining jobs in the job queue. 
 - 
void stop()¶
- Stop all the workers normally. - Note
- stopAddJob() should be called before it.
 
 - 
void forceStop()¶
- Stop all the workers forcibly. - Note
- This function will call stopAddJob() first and empty the result queue.
 
 - 
void addJob(JobFunc func)¶
- Add a job to the job queue. - Note
- Job can not be added after calling stopAddJob().
 
 - 
void stopAddJob()¶
- Stop adding new jobs to the job queue. - Note
- This fuction enqueue a return nullptr function to the job queue.
 
 - 
ResultPtrType waitResult()¶
- Dequeue the first result in the result queue and return it. - Note
- If the result queue is empty, wait until it’s not empty or return nullptr if all the results have been returned.
 
 - 
bool testResult()¶
- The result queue is empty or not. - Return
- true if empty.
 
 - Protected Functions - 
virtual void run()¶
- Do the jobs in the job queue sequentianlly and enqueue the result into the result queue. - Note
- A nullptr will be enqueued into the resulte queue, when a worker finished.
 
 - Protected Attributes - 
bool stopping_¶
 - 
bool jobAdding_¶
 - 
size_t nullResultNum_¶
 - 
BlockingQueue<ResultPtrType> results_¶
 - 
std::vector<std::unique_ptr<std::thread>> workers_¶
 
- 
typedef T 
class AsyncThreadPool¶
- 
class paddle::AsyncThreadPool¶
- AsyncThreadPool maintains a job queue and threads pool. It executes the jobs from queue asynchronously. - Add jobs: - Use addJob() to add a new job to the job queue and get a std::future result. The caller’s thread continues running. Call std::future::get() when the result’s value is needed, and the caller’s thread may be blocked until thread-pool finished the job. - Use addBatchJobs() to add a batch of jobs. Unlike addJob()‘s asynchronization, addBatchJobs will block caller’s thread until all jobs in the batch are finished. - Stop: Use stop() to stop the thread pool. Job can be added once stopped. - Process-wide Singleton: Use AsyncThreadPool::ProcessChannel(N) first to create N threads. Then call AsyncThreadPool::ProcessChannel() to get the process-wide global thread pool. - Public Types - 
typedef std::function<void()> JobFunc¶
 - Public Functions - 
AsyncThreadPool()¶
 - 
AsyncThreadPool(size_t threadNum)¶
- Construct Function. Install all the workers. - Parameters
- threadNum-- Number of the threads, must greater than 1. 
 
 
 - 
~AsyncThreadPool()¶
 - 
void stop()¶
- Stop all the workers normally. 
 - template <class F, class... Args>
- 
auto addJob(F &&f, Args&&... args)¶
- Add a job to queue and return a std::future. - Note
- The job will be executed asynchronously. Call std::future::get() when the execturation result is needed;
 
 - template <class F>
- 
void addBatchJobs(const std::vector<F> &jobs, std::vector<typename std::result_of<F()>::type> &results)¶
- Add a batch of jobs to the queue. The main thread will be blocked until these jobs are finished. The results will be stored in - resultsaccording to- jobsorder.- Note
- results may need to be carefully cleared before addBatchJobs().
- Template Parameters
- F-- should have a return value. 
 
- Parameters
- jobs-- a vector of executable objection. 
- results-- a vector to store the results. 
 
 
 - template <class F>
- 
void addBatchJobs(const std::vector<F> &jobs)¶
- Add a batch of jobs reguardless of its result. - Template Parameters
- F-- don’t need to have a return value. 
 
- Parameters
- jobs-- a vector of executable objection. 
 
 
 - Public Static Functions - 
static AsyncThreadPool &ProcessChannel(size_t initThreadNum = 0)¶
- A process-wide singleton. Used as a global thread pool It should be initialized by calling AsyncThreadPool::ProcessChannel(N) first to create N threads, then call AsyncThreadPool::ProcessChannel() will get the thread pool. 
 - Protected Functions - 
void run()¶
- Execute the jobs in the job queue. 
 
- 
typedef std::function<void()>