From 157530b8b6e11efc5573d5a0db8987a440197aa1 Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 29 Mar 2019 22:28:40 +0800 Subject: *misc --- source/libs/asura-lib-utils/threading/thread.h | 108 ++++++++++++++++++++----- 1 file changed, 90 insertions(+), 18 deletions(-) (limited to 'source/libs/asura-lib-utils/threading/thread.h') 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_newthread创建出来的lua_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,会等待手动stop。否则会在某时刻队列完成后自动stop。 + /// + bool Start(bool daemon = true, uint32 stacksize = 0); /// - /// 强制终止线程。注意要避免在new和delete之间执行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 mTaskQueue; - Mutex mMutex; - - lua_State* mLuaThread; + Mutex mTaskQueueMutex; + /// + /// 延迟模式使用 + /// std::queue 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; -- cgit v1.1-26-g67d0