1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
/*=========================================================================
Program: Visualization Toolkit
Module: vtkSMPThreadPool.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkSMPThreadPool - A thread pool implementation using std::thread
//
// .SECTION Description
// vtkSMPThreadPool class creates a thread pool of std::thread, the number
// of thread must be specified at the initialization of the class.
// The DoJob() method is used attributes the job to a free thread, if all
// threads are working, the job is kept in a queue. Note that vtkSMPThreadPool
// destructor joins threads and finish the jobs in the queue.
#ifndef vtkSMPThreadPool_h
#define vtkSMPThreadPool_h
#include "vtkCommonCoreModule.h" // For export macro
#include "vtkSystemIncludes.h"
#include <condition_variable> // For std::condition_variable
#include <functional> // For std::function
#include <mutex> // For std::mutex
#include <queue> // For std::queue
#include <thread> // For std::thread
namespace vtk
{
namespace detail
{
namespace smp
{
VTK_ABI_NAMESPACE_BEGIN
class VTKCOMMONCORE_EXPORT vtkSMPThreadPool
{
public:
explicit vtkSMPThreadPool(int ThreadNumber);
void Join();
void DoJob(std::function<void(void)> job);
std::vector<std::thread>* GetThreads();
private:
void ThreadJob();
private:
std::mutex Mutex;
bool Joining = false;
std::condition_variable ConditionVariable;
std::queue<std::function<void(void)>> JobQueue;
std::vector<std::thread> Threads;
};
VTK_ABI_NAMESPACE_END
} // namespace smp
} // namespace detail
} // namespace vtk
#endif
/* VTK-HeaderTest-Exclude: vtkSMPThreadPool.h */
|