diff options
author | chai <chaifix@163.com> | 2019-03-29 22:28:40 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-03-29 22:28:40 +0800 |
commit | 157530b8b6e11efc5573d5a0db8987a440197aa1 (patch) | |
tree | f9df79c013885e13dc81e7046c9828037eb29e2e /source/libs/asura-lib-utils/threading/thread.h | |
parent | e37b1dfd022bda4dfdcba243c0543c62c89db32f (diff) |
*misc
Diffstat (limited to 'source/libs/asura-lib-utils/threading/thread.h')
-rw-r--r-- | source/libs/asura-lib-utils/threading/thread.h | 108 |
1 files changed, 90 insertions, 18 deletions
diff --git a/source/libs/asura-lib-utils/threading/thread.h b/source/libs/asura-lib-utils/threading/thread.h index 3928963..0e75770 100644 --- a/source/libs/asura-lib-utils/threading/thread.h +++ b/source/libs/asura-lib-utils/threading/thread.h @@ -8,6 +8,7 @@ #include "task.h" #include "mutex.h" +#include "semaphore.h" namespace AsuraEngine { @@ -22,20 +23,19 @@ namespace AsuraEngine /// ̵߳ص첽Ϊͬlua_Stateͻ⡣ /// 2: Immediateģʽÿһ߳άһlua_newthreadlua_State /// صڲͬlua_Stateеãⲻ̷ͬ߳ͬһlua_State - /// 3: Daemonػģʽ̻߳һֱں̨ /// enum ThreadType { THREAD_TYPE_DEFERRED, THREAD_TYPE_IMMEDIATE, - THREAD_TYPE_DAEMON }; enum ThreadState { - THREAD_STATE_RUNNING, - THREAD_STATE_DEAD, - THREAD_STATE_SUSPEND, + THREAD_STATE_IDLE, ///< ãδں˶ + THREAD_STATE_RUNNING, ///< ѭ + THREAD_STATE_PAUSED, ///< ѭͣ + THREAD_STATE_STOPPED, ///< ˳ѭ }; /// @@ -48,27 +48,54 @@ namespace AsuraEngine LUAX_DECL_FACTORY(Thread); - Thread(ThreadType type, Luax::LuaxState& luaThread, const std::string& name = ""); + Thread(lua_State* luaThread, ThreadType type = THREAD_TYPE_DEFERRED, uint sleepTime = 1, const std::string& name = ""); ~Thread(); bool AddTask(Task* task); + /// + /// õȴ + /// + uint GetTaskCount(); + + void Idle(); - void Start(uint32 stacksize = 0); + /// + /// ں˶Сdaemonȴֶstopijʱ̶ɺԶstop + /// + bool Start(bool daemon = true, uint32 stacksize = 0); /// - /// ǿֹ̡߳עҪnewdeleteִ֮TerminateThreadڼ - /// ʹnewˡ - /// https://blog.csdn.net/anye3000/article/details/7470674 - /// ע⣺ҪʹӿڣӦ߳Լеյ㣬ֶر + /// ͬ߳̿ƣʵʱġҪ߳ʹIsȷϵָ״̬ /// - void Kill(); + void Pause(); + void Resume(); + void Stop(); + + /// + /// ͬ߳̿ƣȷźźִС̵߳ȴ + /// + void PauseSync(); + void ResumeSync(); + void StopSync(); /// /// ̵߳ȴ߳̽żִС /// void Join(); + ThreadState GetState(); + + /// + /// ߳״̬ + /// 1: IdleУ̴߳Ĭ״̬ʱStart + /// 2: RunningУں˶´Ѿں˵УTask + /// 3: PausedͣȻںУ˶Ĵͣ + /// 4: StoppedֹͣȻںУѾ + /// + bool IsIdle(); bool IsRunning(); + bool IsPaused(); + bool IsStopped(); bool IsCurrent(); @@ -84,41 +111,84 @@ namespace AsuraEngine /// void Post(); + /// + /// ߺ + /// + void Sleep(uint ms); + + /// + /// ʱ + /// + void SetSleepTime(uint ms); + private: //----------------------------------------------------------------------------// LUAX_DECL_ENUM(ThreadType); + LUAX_DECL_ENUM(ThreadState); LUAX_DECL_METHOD(_New); + LUAX_DECL_METHOD(_AddTask); LUAX_DECL_METHOD(_Start); + LUAX_DECL_METHOD(_Idle); + LUAX_DECL_METHOD(_Pause); + LUAX_DECL_METHOD(_Resume); + LUAX_DECL_METHOD(_Stop); LUAX_DECL_METHOD(_Join); - LUAX_DECL_METHOD(_Kill); - LUAX_DECL_METHOD(_AddTask); LUAX_DECL_METHOD(_IsRunning); + LUAX_DECL_METHOD(_IsPaused); + LUAX_DECL_METHOD(_IsStopped); LUAX_DECL_METHOD(_IsCurrent); - LUAX_DECL_METHOD(_GetName); LUAX_DECL_METHOD(_Sleep); LUAX_DECL_METHOD(_Post); + LUAX_DECL_METHOD(_GetName); LUAX_DECL_METHOD(_GetType); + LUAX_DECL_METHOD(_GetState); + LUAX_DECL_METHOD(_SetSleepTime); //----------------------------------------------------------------------------// + /// + /// ˴Ƿػģʽ + /// + bool mIsDaemon; + + lua_State* mLuaThread; + ThreadImpl* mImpl; std::string mName; ThreadType mType; + uint mSleepTime; + + ThreadState mState; + Mutex mStateMutex; + + /// + /// ͬصź + /// + Semaphore mSemPause; + Semaphore mSemResume; + Semaphore mSemStop; /// /// С /// std::queue<Task*> mTaskQueue; - Mutex mMutex; - - lua_State* mLuaThread; + Mutex mTaskQueueMutex; + /// + /// ӳģʽʹ + /// std::queue<Task*> mFinishedTasks; Mutex mFinishedMutex; + /// + /// ģʽʹãصʹõlua߳ + /// + lua_State* mCallbackThread; + Luax::LuaxMemberRef mCallbackThreadRef; + }; /// @@ -138,6 +208,8 @@ namespace AsuraEngine virtual void Join() = 0; virtual void Kill() = 0; + virtual void Sleep(uint ms) = 0; + virtual bool IsRunning() = 0; virtual bool IsCurrent() = 0; |