10#include <condition_variable>
43 requires std::invocable<F&>
44 std::invoke_result_t<F&>
run(F&& f) {
45 if (std::this_thread::get_id() == m_thread.get_id())
47 using R = std::invoke_result_t<F&>;
48 std::packaged_task<R()> task{std::forward<F>(f)};
49 auto result = task.get_future();
52 post([&task] { task(); });
62 void post(std::function<
void()> task);
63 void loop(std::stop_token stopToken);
66 std::condition_variable_any m_cv;
67 std::deque<std::function<void()>> m_tasks;
68 std::jthread m_thread;
Runs posted tasks on one dedicated thread until destroyed.
Definition GeometryThread.h:27
GeometryThread(const GeometryThread &)=delete
~GeometryThread()=default
GeometryThread & operator=(GeometryThread &&)=delete
GeometryThread(GeometryThread &&)=delete
std::invoke_result_t< F & > run(F &&f)
Run f on the geometry thread and return its result.
Definition GeometryThread.h:44
GeometryThread & operator=(const GeometryThread &)=delete
friend GeometryThread & geometry_thread()
The process-wide Geant4 geometry thread, shared by every geometry user (GENIE geometry analyzers,...
Definition GeometryThread.cpp:35
Definition G4RayScanner.h:15
GeometryThread & geometry_thread()
The process-wide Geant4 geometry thread, shared by every geometry user (GENIE geometry analyzers,...
Definition GeometryThread.cpp:35