Botan 3.0.0
Crypto and TLS for C&
thread_pool.h
Go to the documentation of this file.
1/*
2* (C) 2019 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#ifndef BOTAN_THREAD_POOL_H_
8#define BOTAN_THREAD_POOL_H_
9
10#include <botan/types.h>
11#include <functional>
12#include <deque>
13#include <vector>
14#include <memory>
15#include <utility>
16#include <type_traits>
17#include <mutex>
18#include <thread>
19#include <future>
20#include <condition_variable>
21#include <optional>
22
23namespace Botan {
24
26 {
27 public:
28 /**
29 * Return an instance to a shared thread pool
30 */
31 static Thread_Pool& global_instance();
32
33 /**
34 * Initialize a thread pool with some number of threads
35 * @param pool_size number of threads in the pool, if 0
36 * then some default value is chosen. If the optional
37 * is nullopt then the thread pool is disabled; all
38 * work is executed immediately when queued.
39 */
40 Thread_Pool(std::optional<size_t> pool_size);
41
42 /**
43 * Initialize a thread pool with some number of threads
44 * @param pool_size number of threads in the pool, if 0
45 * then some default value is chosen.
46 */
47 Thread_Pool(size_t pool_size = 0) :
48 Thread_Pool(std::optional<size_t>(pool_size))
49 {}
50
51 ~Thread_Pool() { shutdown(); }
52
53 void shutdown();
54
55 size_t worker_count() const { return m_workers.size(); }
56
57 Thread_Pool(const Thread_Pool&) = delete;
59
62
63 /*
64 * Enqueue some work
65 */
66 void queue_thunk(const std::function<void ()>&);
67
68 template<class F, class... Args>
69 auto run(F&& f, Args&&... args) -> std::future<typename std::invoke_result<F, Args...>::type>
70 {
71 using return_type = typename std::invoke_result<F, Args...>::type;
72
73 auto future_work = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
74 auto task = std::make_shared<std::packaged_task<return_type ()>>(future_work);
75 auto future_result = task->get_future();
76 queue_thunk([task]() { (*task)(); });
77 return future_result;
78 }
79
80 private:
81 void worker_thread();
82
83 // Only touched in constructor and destructor
84 std::vector<std::thread> m_workers;
85
86 std::mutex m_mutex;
87 std::condition_variable m_more_tasks;
88 std::deque<std::function<void ()>> m_tasks;
89 bool m_shutdown;
90 };
91
92}
93
94#endif
Thread_Pool(Thread_Pool &&)=delete
size_t worker_count() const
Definition: thread_pool.h:55
Thread_Pool & operator=(Thread_Pool &&)=delete
Thread_Pool(size_t pool_size=0)
Definition: thread_pool.h:47
auto run(F &&f, Args &&... args) -> std::future< typename std::invoke_result< F, Args... >::type >
Definition: thread_pool.h:69
Thread_Pool & operator=(const Thread_Pool &)=delete
Thread_Pool(const Thread_Pool &)=delete
int(* final)(unsigned char *, CTX *)
#define BOTAN_TEST_API
Definition: compiler.h:51
Definition: alg_id.cpp:12
Definition: bigint.h:1092