From c302f5ae5f9e30a28e487e8a764d9cc31546bbea Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 29 Mar 2019 22:51:04 +0800 Subject: *rename --- source/modules/asura-utils/threading/thread.h | 221 ++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 source/modules/asura-utils/threading/thread.h (limited to 'source/modules/asura-utils/threading/thread.h') diff --git a/source/modules/asura-utils/threading/thread.h b/source/modules/asura-utils/threading/thread.h new file mode 100644 index 0000000..340fca3 --- /dev/null +++ b/source/modules/asura-utils/threading/thread.h @@ -0,0 +1,221 @@ +#ifndef __ASURA_THREAD_H__ +#define __ASURA_THREAD_H__ + +#include +#include + +#include + +#include "task.h" +#include "mutex.h" +#include "semaphore.h" + +namespace AsuraEngine +{ + namespace Threading + { + + class ThreadImpl; + + /// + /// 线程的几种不同的实现: + /// 1: Deferred(延迟模式),线程上的任务完成后,需要手动在主线程调用Post方法, + /// 在主线程调回调函数,将发布从异步改为同步操作,解决主lua_State冲突的问题。 + /// 2: Immediate(立即模式),每一个线程维护一个lua_newthread创建出来的lua_State。 + /// 回调函数在不同的lua_State中调用,避免不同的线程访问同一个lua_State。 + /// + enum ThreadType + { + THREAD_TYPE_DEFERRED, + THREAD_TYPE_IMMEDIATE, + }; + + enum ThreadState + { + THREAD_STATE_IDLE, ///< 闲置,还未创建内核对象 + THREAD_STATE_RUNNING, ///< 正在运行循环 + THREAD_STATE_PAUSED, ///< 在循环中暂停 + THREAD_STATE_STOPPED, ///< 退出循环 + }; + + /// + /// 线程主体,每个线程维护一个task queue。 + /// + class Thread ASURA_FINAL + : public AEScripting::Portable + { + public: + + LUAX_DECL_FACTORY(Thread); + + 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(); + + /// + /// 创建内核对象,并运行。如果是daemon,会等待手动stop。否则会在某时刻队列完成后自动stop。 + /// + bool Start(bool daemon = true, uint32 stacksize = 0); + + /// + /// 非同步线程控制,不是实时的。可能需要在主线程里使用Is函数确认到达指定状态。 + /// + 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(); + + /// + /// 执行任务队列。 + /// + void Process(); + + const std::string& GetName(); + + /// + /// 回调。 + /// + 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(_IsRunning); + LUAX_DECL_METHOD(_IsPaused); + LUAX_DECL_METHOD(_IsStopped); + LUAX_DECL_METHOD(_IsCurrent); + 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 mTaskQueueMutex; + + /// + /// 延迟模式使用 + /// + std::queue mFinishedTasks; + Mutex mFinishedMutex; + + /// + /// 立即模式使用,回调使用的lua线程 + /// + lua_State* mCallbackThread; + Luax::LuaxMemberRef mCallbackThreadRef; + + }; + + /// + /// 线程的具体实现,对用户是透明的,一共准备了四种策略: + /// 1: win32 + /// 2: posix + /// 3: SDL + /// 4: std::thread + /// + ASURA_ABSTRACT class ThreadImpl + { + public: + ThreadImpl() {}; + virtual ~ThreadImpl() {}; + + virtual bool Start(Thread* thread, uint32 stacksize = 0) = 0; + virtual void Join() = 0; + virtual void Kill() = 0; + + virtual void Sleep(uint ms) = 0; + + virtual bool IsRunning() = 0; + virtual bool IsCurrent() = 0; + + }; + + } +} + +#endif \ No newline at end of file -- cgit v1.1-26-g67d0