VTK  9.0.1
vtkThreadedTaskQueue.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkThreadedTaskQueue.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
51 #ifndef vtkThreadedTaskQueue_h
52 #define vtkThreadedTaskQueue_h
53 
54 #include "vtkObject.h"
55 #include <atomic>
56 #include <condition_variable>
57 #include <cstdint>
58 #include <functional>
59 #include <memory>
60 #include <mutex>
61 #include <thread>
62 
63 #if !defined(__WRAP__)
65 {
66 template <typename R>
67 class TaskQueue;
68 
69 template <typename R>
71 };
72 
73 template <typename R, typename... Args>
75 {
76 public:
77  vtkThreadedTaskQueue(std::function<R(Args...)> worker, bool strict_ordering = true,
78  int buffer_size = -1, int max_concurrent_tasks = -1);
80 
84  void Push(Args&&... args);
85 
90  bool Pop(R& result);
91 
96  bool TryPop(R& result);
97 
102  bool IsEmpty() const;
103 
107  void Flush();
108 
109 private:
111  void operator=(const vtkThreadedTaskQueue&) = delete;
112 
113  std::function<R(Args...)> Worker;
114 
115  std::unique_ptr<vtkThreadedTaskQueueInternals::TaskQueue<R> > Tasks;
116  std::unique_ptr<vtkThreadedTaskQueueInternals::ResultQueue<R> > Results;
117 
118  int NumberOfThreads;
119  std::unique_ptr<std::thread[]> Threads;
120 };
121 
122 template <typename... Args>
123 class vtkThreadedTaskQueue<void, Args...>
124 {
125 public:
126  vtkThreadedTaskQueue(std::function<void(Args...)> worker, bool strict_ordering = true,
127  int buffer_size = -1, int max_concurrent_tasks = -1);
129 
133  void Push(Args&&... args);
134 
139  bool IsEmpty() const;
140 
144  void Flush();
145 
146 private:
148  void operator=(const vtkThreadedTaskQueue&) = delete;
149 
150  std::function<void(Args...)> Worker;
151 
152  std::unique_ptr<vtkThreadedTaskQueueInternals::TaskQueue<void> > Tasks;
153 
154  std::condition_variable ResultsCV;
155  std::mutex NextResultIdMutex;
156  std::atomic<std::uint64_t> NextResultId;
157 
158  int NumberOfThreads;
159  std::unique_ptr<std::thread[]> Threads;
160 };
161 
162 #include "vtkThreadedTaskQueue.txx"
163 
164 #endif // !defined(__WRAP__)
165 
166 #endif
167 // VTK-HeaderTest-Exclude: vtkThreadedTaskQueue.h
vtkThreadedTaskQueue::Pop
bool Pop(R &result)
Pop the last result.
vtkThreadedTaskQueueInternals::TaskQueue
Definition: vtkThreadedTaskQueue.h:67
vtkX3D::function
@ function
Definition: vtkX3D.h:255
vtkThreadedTaskQueue::Push
void Push(Args &&... args)
Push arguments for the work.
vtkThreadedTaskQueue::vtkThreadedTaskQueue
vtkThreadedTaskQueue(std::function< R(Args...)> worker, bool strict_ordering=true, int buffer_size=-1, int max_concurrent_tasks=-1)
vtkThreadedTaskQueue::~vtkThreadedTaskQueue
~vtkThreadedTaskQueue()
vtkThreadedTaskQueueInternals::ResultQueue
Definition: vtkThreadedTaskQueue.h:70
vtkThreadedTaskQueue
simple threaded task queue
Definition: vtkThreadedTaskQueue.h:74
vtkThreadedTaskQueueInternals
Definition: vtkThreadedTaskQueue.h:64
vtkThreadedTaskQueue::TryPop
bool TryPop(R &result)
Attempt to pop without waiting.
vtkThreadedTaskQueue::IsEmpty
bool IsEmpty() const
Returns false if there's some result that may be popped right now or in the future.
vtkObject.h
vtkThreadedTaskQueue::Flush
void Flush()
Blocks till the queue becomes empty.