From 99e2e923d0c77b02f3fb4ff648ea916954868606 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Fri, 28 Feb 2025 23:13:39 +0800 Subject: chore(store): move everything to store. --- .../life/operating-system-experiment/Thread.h | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 store/works/life/operating-system-experiment/Thread.h (limited to 'store/works/life/operating-system-experiment/Thread.h') diff --git a/store/works/life/operating-system-experiment/Thread.h b/store/works/life/operating-system-experiment/Thread.h new file mode 100644 index 0000000..4ad1ef4 --- /dev/null +++ b/store/works/life/operating-system-experiment/Thread.h @@ -0,0 +1,83 @@ +#ifndef HEADER_THREAD_H +#define HEADER_THREAD_H + +#include "Base.h" + +#ifdef CRU_WINDOWS +#include +#else +#include +#endif + +#ifdef __cplusplus + +#include +#include +#include +#include +#include +#include +#include + +namespace cru { +class CRU_API Thread { +public: + Thread() = default; + template Thread(Fn &&process, Args &&...args); + Thread(const Thread &other) = delete; + Thread(Thread &&other) noexcept; + Thread &operator=(const Thread &other) = delete; + Thread &operator=(Thread &&other) noexcept; + ~Thread(); + +public: + void Join(); + void Detach(); + +#ifdef CRU_WINDOWS + DWORD +#else + pthread_t +#endif + GetNativeID(); + +#ifdef CRU_WINDOWS + HANDLE +#else + pthread_t +#endif + GetNativeHandle(); + + void swap(Thread &other) noexcept; + +private: + void Destroy() noexcept; + void CreateThread(std::function *proc); + +private: + bool detached_ = false; + bool joined_ = false; + +#ifdef CRU_WINDOWS + DWORD thread_id_ = 0; + HANDLE thread_handle_ = nullptr; +#else + std::unique_ptr thread_; +#endif +}; + +template +Thread::Thread(Fn &&process, Args &&...args) { + std::tuple...> a{std::forward(args)...}; + auto p = new std::function( + [process = std::forward(process), args = std::move(a)]() { + std::apply(process, std::move(args)); + }); + + CreateThread(p); +}; +} // namespace cru + +#endif + +#endif -- cgit v1.2.3