ThreadSchedule 1.0.0
Modern C++ thread management library
Loading...
Searching...
No Matches
profiles.hpp
Go to the documentation of this file.
1#pragma once
2
12
13#include "concepts.hpp"
14#include "scheduler_policy.hpp"
15#include "thread_pool.hpp"
16#include "thread_registry.hpp"
17#include <optional>
18#include <string>
19
20namespace threadschedule
21{
22
27{
28 std::string name;
29 SchedulingPolicy policy;
30 ThreadPriority priority;
31 std::optional<ThreadAffinity> affinity; // optional pinning
32};
33
34namespace profiles
35{
40inline auto realtime() -> ThreadProfile
41{
42 return ThreadProfile{"realtime",
43#ifdef _WIN32
44 SchedulingPolicy::OTHER,
45#else
46 SchedulingPolicy::FIFO,
47#endif
48 ThreadPriority::highest(), std::nullopt};
49}
50
54inline auto low_latency() -> ThreadProfile
55{
56 return ThreadProfile{"low_latency", SchedulingPolicy::RR, ThreadPriority{5}, std::nullopt};
57}
58
62inline auto throughput() -> ThreadProfile
63{
64 return ThreadProfile{"throughput", SchedulingPolicy::BATCH, ThreadPriority::normal(), std::nullopt};
65}
66
70inline auto background() -> ThreadProfile
71{
72 return ThreadProfile{"background", SchedulingPolicy::IDLE, ThreadPriority::lowest(), std::nullopt};
73}
74} // namespace profiles
75
79template <typename ThreadLike, std::enable_if_t<is_thread_like_v<ThreadLike>, int> = 0>
80inline auto apply_profile(ThreadLike& t, ThreadProfile const& p) -> expected<void, std::error_code>
81{
82 bool ok = true;
83 if (!t.set_scheduling_policy(p.policy, p.priority).has_value())
84 ok = false;
85 if (p.affinity.has_value())
86 {
87 if (!t.set_affinity(*p.affinity).has_value())
88 ok = false;
89 }
90 if (ok)
91 return {};
92 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
93}
94
99{
100 bool ok = true;
101 if (!t.set_scheduling_policy(p.policy, p.priority).has_value())
102 ok = false;
103 if (p.affinity.has_value())
104 {
105 if (!t.set_affinity(*p.affinity).has_value())
106 ok = false;
107 }
108 if (ok)
109 return {};
110 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
111}
112
117{
118 return apply_profile(*t.control, p);
119}
120
125{
126 bool ok = true;
127 // Name prefix left to caller via configure_threads; here just policy/priority
128 if (!pool.configure_threads("pool", p.policy, p.priority))
129 ok = false;
130 if (p.affinity.has_value())
131 {
132 if (!pool.set_affinity(*p.affinity))
133 ok = false;
134 }
135 if (ok)
136 return {};
137 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
138}
139
144{
145 bool ok = true;
146 if (!pool.configure_threads("hp", p.policy, p.priority).has_value())
147 ok = false;
148 if (p.affinity.has_value())
149 {
150 if (!pool.set_affinity(*p.affinity).has_value())
151 ok = false;
152 }
153 if (ok)
154 return {};
155 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
156}
157
162{
163 bool ok = true;
164 if (!reg.set_scheduling_policy(tid, p.policy, p.priority).has_value())
165 ok = false;
166 if (p.affinity.has_value())
167 {
168 if (!reg.set_affinity(tid, *p.affinity).has_value())
169 ok = false;
170 }
171 if (ok)
172 return {};
173 return unexpected(std::make_error_code(std::errc::operation_not_permitted));
174}
175
176} // namespace threadschedule
High-performance thread pool optimized for high-frequency task submission.
Simple thread pool for general-purpose use.
Thread priority wrapper with validation.
auto apply_profile(ThreadLike &t, ThreadProfile const &p) -> expected< void, std::error_code >
Apply a profile to a single thread wrapper or view.
Definition profiles.hpp:80
auto throughput() -> ThreadProfile
Throughput-oriented profile favoring batch scheduling.
Definition profiles.hpp:62
auto background() -> ThreadProfile
Background profile for very low priority work.
Definition profiles.hpp:70
auto low_latency() -> ThreadProfile
Low-latency interactive profile using RR scheduling.
Definition profiles.hpp:54
auto realtime() -> ThreadProfile
Highest priority profile. Uses FIFO on Linux (if permitted), falls back to OTHER on Windows.
Definition profiles.hpp:40
Declarative profile describing desired scheduling.
Definition profiles.hpp:27