From d42dfdf4b903763997d47b6e2214c2ce33b9bf8e Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 9 Jun 2021 21:59:17 +0800 Subject: import(life): Add operating system experiement. --- works/life/operating-system-experiment/Thread.h | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 works/life/operating-system-experiment/Thread.h (limited to 'works/life/operating-system-experiment/Thread.h') diff --git a/works/life/operating-system-experiment/Thread.h b/works/life/operating-system-experiment/Thread.h new file mode 100644 index 0000000..c71c11f --- /dev/null +++ b/works/life/operating-system-experiment/Thread.h @@ -0,0 +1,68 @@ +#ifndef HEADER_THREAD_H +#define HEADER_THREAD_H + +#include "Base.h" + +#ifdef __cplusplus + +#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(); + + void swap(Thread &other) noexcept; + +private: + void Destroy() noexcept; + +private: + bool detached_ = false; + bool joined_ = false; + +#ifdef CRU_WINDOWS + DWORD thread_id_ = 0; + HANDLE thread_handle_ = nullptr; +#endif +}; + +namespace details { +#ifdef CRU_WINDOWS +CRU_API DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter); +#else +#endif +} // namespace details + +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)); + }); + +#ifdef CRU_WINDOWS + thread_handle_ = ::CreateThread(nullptr, 0, &::cru::details::ThreadProc, + static_cast(p), 0, &thread_id_); +#endif +}; +} // namespace cru + +#endif + +#endif -- cgit v1.2.3