From 3fa4d41e9cac75df7514c2ff8dd27842aaafc4a7 Mon Sep 17 00:00:00 2001 From: Keuin Date: Wed, 20 Apr 2022 00:22:02 +0800 Subject: Code refactor: make basic_viewport and aa_viewport no longer a child class. Move data into classes. Code refactor: make threading.h more specific, reducing redundant data copies in memory. Code refactor: make camera parameters more clear and well-defined in viewport.h, ready to extend camera flexibility. --- threading.h | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'threading.h') diff --git a/threading.h b/threading.h index 73a1741..6d79494 100644 --- a/threading.h +++ b/threading.h @@ -18,31 +18,36 @@ // Tasks should be added into the queue before starting. // Once the task queue is empty, threads quit. +template +using task_func_t = void (*)(size_t, T_Args &, const T_ImmuCtx &, T_MutCtx &); + // internal usage -template +template struct s_task { - void (*f)(T &); - + task_func_t f; T arg; }; -template +template class thread_pool { unsigned thread_count; std::vector workers; std::atomic counter{0}; // index to the first available task in queue - std::vector> tasks; + std::vector> tasks; + const U &shared_ctx; // reference to immutable shared context + V &mut_shared_ctx; // mutable shared context void worker_main(); public: - explicit thread_pool(unsigned thread_count) : thread_count{thread_count} { + explicit thread_pool(unsigned thread_count, const U &shared_ctx, V &mut_shared_ctx) : + thread_count{thread_count}, shared_ctx{shared_ctx}, mut_shared_ctx{mut_shared_ctx} { std::cerr << "Using " << (counter.is_lock_free() ? "lock-free" : "locking") << " dispatcher." << std::endl; } // Thread unsafe! - void submit_task(void (*f)(T &), T &&t); + void submit_task(task_func_t f, T &&t); void start(); @@ -50,36 +55,36 @@ public: void wait(); }; -template -void thread_pool::start() { +template +void thread_pool::start() { if (workers.empty()) { for (typeof(thread_count) i = 0; i < thread_count; ++i) { - workers.emplace_back(std::thread{&thread_pool::worker_main, this}); + workers.emplace_back(std::thread{&thread_pool::worker_main, this}); } } else { // TODO } } -template -void thread_pool::worker_main() { +template +void thread_pool::worker_main() { const auto max_cnt = tasks.size(); while (true) { const auto i = counter.fetch_add(1, std::memory_order_relaxed); // we only need atomicity if (i >= max_cnt) break; // all tasks are done auto &task = tasks[i]; - task.f(task.arg); + task.f(i, task.arg, shared_ctx, mut_shared_ctx); } } // Do not submit after starting. -template -void thread_pool::submit_task(void (*f)(T &), T &&t) { - tasks.push_back(s_task{.f=f, .arg=std::move(t)}); +template +void thread_pool::submit_task(task_func_t f, T &&t) { + tasks.push_back(s_task{.f=f, .arg=std::move(t)}); } -template -void thread_pool::wait() { +template +void thread_pool::wait() { for (auto &th: workers) { th.join(); } -- cgit v1.2.3