Scroom 0.14-49-gb7ae7a6d
Loading...
Searching...
No Matches
threadpool.hh
Go to the documentation of this file.
1/*
2 * Scroom - Generic viewer for 2D data
3 * Copyright (C) 2009-2026 Kees-Jan Dijkzeul
4 *
5 * SPDX-License-Identifier: LGPL-2.1
6 */
7
8#pragma once
9
10#include <memory>
11#include <queue>
12#include <vector>
13
14#include <boost/function.hpp>
15#include <boost/thread.hpp>
16
17#include <scroom/semaphore.hh>
18
20enum
21{
29};
30
32{
33 class QueueImpl;
34} // namespace Scroom::Detail::ThreadPool
35
43{
44public:
45 class WeakQueue;
46
75 class Queue
76 {
77 public:
78 using Ptr = std::shared_ptr<Queue>;
79 using WeakPtr = std::weak_ptr<Queue>;
80
81 public:
87 static Ptr create();
88
94 static Ptr createAsync();
95
96 ~Queue();
97 std::shared_ptr<Scroom::Detail::ThreadPool::QueueImpl> get();
98 std::shared_ptr<WeakQueue> getWeak();
99
100 private:
101 Queue();
102 Queue(const Queue&) = delete;
103 Queue(Queue&&) = delete;
104 Queue& operator=(const Queue&) = delete;
105 Queue& operator=(Queue&&) = delete;
106
107 private:
108 std::shared_ptr<WeakQueue> weak;
109 };
110
131 {
132 public:
133 using Ptr = std::shared_ptr<WeakQueue>;
134 using WeakPtr = std::weak_ptr<WeakQueue>;
135
136 public:
137 ~WeakQueue() = default;
138
139 WeakQueue(const WeakQueue&) = delete;
140 WeakQueue(WeakQueue&&) = delete;
141 WeakQueue& operator=(const WeakQueue&) = delete;
143
144 static Ptr create();
145 std::shared_ptr<Scroom::Detail::ThreadPool::QueueImpl> get();
146
147 private:
148 WeakQueue();
149
150 private:
151 std::shared_ptr<Scroom::Detail::ThreadPool::QueueImpl> qi;
152 };
153
154private:
155 struct Job
156 {
157 std::shared_ptr<Scroom::Detail::ThreadPool::QueueImpl> queue;
158 boost::function<void()> fn;
159
160 Job() = default;
161 Job(boost::function<void()> fn, const WeakQueue::Ptr& queue);
162 };
163
164public:
165 using Ptr = std::shared_ptr<ThreadPool>;
166 using ThreadPtr = std::shared_ptr<boost::thread>;
167
168private:
190 {
191 public:
192 using Ptr = std::shared_ptr<PrivateData>;
193
194 public:
195 unsigned int jobcount{0};
196 boost::mutex mut;
197 bool alive{true};
198 boost::condition_variable cond;
208 std::map<int, std::queue<Job>> jobs;
209
217
234
235 private:
237
238 public:
240 };
241
242 std::list<ThreadPtr> threads;
244
245private:
255 static void work(const PrivateData::Ptr& priv);
256
263 static void do_one(const PrivateData::Ptr& priv);
264
265 static Queue::Ptr defaultQueue();
266 static const int defaultPriority;
267
268public:
270 explicit ThreadPool(bool completeAllJobsBeforeDestruction = false);
271
273 explicit ThreadPool(int count, bool completeAllJobsBeforeDestruction = false);
274
276 static ThreadPool::Ptr create(bool completeAllJobsBeforeDestruction = false);
277
279 static ThreadPool::Ptr create(int count, bool completeAllJobsBeforeDestruction = false);
280
281 ThreadPool(const ThreadPool&) = delete;
285
292 ~ThreadPool();
293
295 void schedule(boost::function<void()> const& fn, int priority = defaultPriority, const Queue::Ptr& queue = defaultQueue());
296
298 void schedule(boost::function<void()> const& fn, const Queue::Ptr& queue);
299
305 template <typename T>
306 void schedule(std::shared_ptr<T> fn, int priority = defaultPriority, const Queue::Ptr& queue = defaultQueue());
307
313 template <typename T>
314 void schedule(std::shared_ptr<T> fn, const Queue::Ptr& queue);
315
317 void schedule(boost::function<void()> const& fn, int priority, const WeakQueue::Ptr& queue);
318
320 void schedule(boost::function<void()> const& fn, const WeakQueue::Ptr& queue);
321
327 template <typename T>
328 void schedule(std::shared_ptr<T> fn, int priority, const WeakQueue::Ptr& queue);
329
335 template <typename T>
336 void schedule(std::shared_ptr<T> fn, WeakQueue::Ptr queue);
337
338 template <typename R>
339 boost::unique_future<R>
340 schedule(boost::function<R()> const& fn, int priority = defaultPriority, const Queue::Ptr& queue = defaultQueue());
341
342 template <typename R>
343 boost::unique_future<R> schedule(boost::function<R()> const& fn, const Queue::Ptr& queue);
344
345 template <typename R, typename T>
346 boost::unique_future<R>
347 schedule(const std::shared_ptr<T>& fn, int priority = defaultPriority, const Queue::Ptr& queue = defaultQueue());
348
349 template <typename R, typename T>
350 boost::unique_future<R> schedule(std::shared_ptr<T> fn, const Queue::Ptr& queue);
351
352 template <typename R>
353 boost::unique_future<R> schedule(boost::function<R()> const& fn, int priority, const WeakQueue::Ptr& queue);
354
355 template <typename R>
356 boost::unique_future<R> schedule(boost::function<R()> const& fn, WeakQueue::Ptr queue);
357
358 template <typename R, typename T>
359 boost::unique_future<R> schedule(const std::shared_ptr<T>& fn, int priority, const WeakQueue::Ptr& queue);
360
361 template <typename R, typename T>
362 boost::unique_future<R> schedule(std::shared_ptr<T> fn, WeakQueue::Ptr queue);
363
371 ThreadPtr add();
372
380 std::vector<ThreadPtr> add(int count);
381};
382
531{
532public:
533 using Ptr = std::shared_ptr<QueueJumper>;
534
535private:
536 boost::mutex mut;
537 bool inQueue{true};
538 bool isSet{false};
539
540 boost::function<void()> fn;
541
542protected:
543 QueueJumper() = default;
544
545public:
557 static Ptr create();
558
567 bool setWork(boost::function<void()> const& fn);
568
569 void operator()();
570};
571
584
602
Definition threadpool.hh:531
bool isSet
Definition threadpool.hh:538
static Ptr create()
QueueJumper.
Definition threadpoolimpl.cc:422
std::shared_ptr< QueueJumper > Ptr
Definition threadpool.hh:533
bool setWork(boost::function< void()> const &fn)
Definition threadpoolimpl.cc:424
void operator()()
Definition threadpoolimpl.cc:441
QueueJumper()=default
bool inQueue
Definition threadpool.hh:537
boost::mutex mut
Definition threadpool.hh:536
boost::function< void()> fn
Definition threadpool.hh:540
Definition threadpool.hh:190
static Ptr create(bool completeAllJobsBeforeDestruction)
Definition threadpoolimpl.cc:201
boost::condition_variable cond
Definition threadpool.hh:198
Queue::Ptr defaultQueue
Definition threadpool.hh:233
std::map< int, std::queue< Job > > jobs
Definition threadpool.hh:208
std::shared_ptr< PrivateData > Ptr
Definition threadpool.hh:192
bool alive
Definition threadpool.hh:197
boost::mutex mut
Definition threadpool.hh:196
bool completeAllJobsBeforeDestruction
Definition threadpool.hh:216
unsigned int jobcount
Definition threadpool.hh:195
Definition threadpool.hh:76
Queue()
Definition threadpoolimpl.cc:384
~Queue()
Definition threadpoolimpl.cc:389
std::shared_ptr< Queue > Ptr
Definition threadpool.hh:78
std::shared_ptr< WeakQueue > getWeak()
Definition threadpoolimpl.cc:393
std::shared_ptr< Scroom::Detail::ThreadPool::QueueImpl > get()
Definition threadpoolimpl.cc:391
Queue & operator=(const Queue &)=delete
static Ptr createAsync()
Definition threadpoolimpl.cc:382
std::shared_ptr< WeakQueue > weak
Definition threadpool.hh:108
Queue(const Queue &)=delete
std::weak_ptr< Queue > WeakPtr
Definition threadpool.hh:79
static Ptr create()
ThreadPool::Queue.
Definition threadpoolimpl.cc:380
Queue(Queue &&)=delete
Queue & operator=(Queue &&)=delete
Definition threadpool.hh:131
std::shared_ptr< Scroom::Detail::ThreadPool::QueueImpl > get()
Definition threadpoolimpl.cc:406
WeakQueue(const WeakQueue &)=delete
WeakQueue()
Definition threadpoolimpl.cc:401
static Ptr create()
ThreadPool::WeakQueue.
Definition threadpoolimpl.cc:399
WeakQueue(WeakQueue &&)=delete
WeakQueue & operator=(WeakQueue &&)=delete
std::shared_ptr< WeakQueue > Ptr
Definition threadpool.hh:133
std::weak_ptr< WeakQueue > WeakPtr
Definition threadpool.hh:134
std::shared_ptr< Scroom::Detail::ThreadPool::QueueImpl > qi
Definition threadpool.hh:151
WeakQueue & operator=(const WeakQueue &)=delete
Definition threadpool.hh:43
std::list< ThreadPtr > threads
Definition threadpool.hh:242
std::shared_ptr< boost::thread > ThreadPtr
Definition threadpool.hh:166
ThreadPool operator=(const ThreadPool &)=delete
PrivateData::Ptr priv
Definition threadpool.hh:243
~ThreadPool()
Definition threadpoolimpl.cc:260
void schedule(boost::function< void()> const &fn, int priority=defaultPriority, const Queue::Ptr &queue=defaultQueue())
Definition threadpoolimpl.cc:345
ThreadPtr add()
Definition threadpoolimpl.cc:241
static Queue::Ptr defaultQueue()
Definition threadpoolimpl.cc:368
ThreadPool(const ThreadPool &)=delete
static void do_one(const PrivateData::Ptr &priv)
Definition threadpoolimpl.cc:311
static void work(const PrivateData::Ptr &priv)
Definition threadpoolimpl.cc:276
static ThreadPool::Ptr create(bool completeAllJobsBeforeDestruction=false)
Definition threadpoolimpl.cc:231
static const int defaultPriority
Definition threadpool.hh:266
ThreadPool(ThreadPool &&)=delete
ThreadPool operator=(ThreadPool &&)=delete
std::shared_ptr< ThreadPool > Ptr
Definition threadpool.hh:165
() void(clear(nullptr)+(5 *clear(nullptr)) *5)
Definition async-deleter.hh:22
const size_t count
Definition pageprovider-tests.cc:21
Definition threadpool.hh:156
std::shared_ptr< Scroom::Detail::ThreadPool::QueueImpl > queue
Definition threadpool.hh:157
boost::function< void()> fn
Definition threadpool.hh:158
ThreadPool::Ptr CpuBound()
Definition threadpoolimpl.cc:455
@ PRIO_LOWER
Definition threadpool.hh:27
@ PRIO_HIGHEST
Definition threadpool.hh:22
@ PRIO_HIGH
Definition threadpool.hh:24
@ PRIO_LOW
Definition threadpool.hh:26
@ PRIO_LOWEST
Definition threadpool.hh:28
@ PRIO_HIGHER
Definition threadpool.hh:23
@ PRIO_NORMAL
Definition threadpool.hh:25
ThreadPool::Ptr Sequentially()
Definition threadpoolimpl.cc:462