From f4c338c63f3456a8eccd56c35e233843687d55be Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 29 Mar 2019 00:43:25 +0800 Subject: *thread --- source/libs/asura-lib-utils/threading/thread.h | 52 ++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 8 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 1bd5f15..3fa079a 100644 --- a/source/libs/asura-lib-utils/threading/thread.h +++ b/source/libs/asura-lib-utils/threading/thread.h @@ -16,6 +16,28 @@ namespace AsuraEngine class ThreadImpl; + /// + /// 线程的几种不同的实现: + /// 1: Deferred(延迟模式),线程上的任务完成后,需要手动在主线程调用Post方法, + /// 在主线程调回调函数,将发布从异步改为同步操作,解决主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, + }; + /// /// 线程主体,每个线程维护一个task queue。 /// @@ -26,7 +48,7 @@ namespace AsuraEngine LUAX_DECL_FACTORY(Thread); - Thread(Luax::LuaxState& father, const std::string& name = ""); + Thread(ThreadType type, Luax::LuaxState& luaThread, const std::string& name = ""); ~Thread(); bool AddTask(Task* task); @@ -34,8 +56,10 @@ namespace AsuraEngine void Start(uint32 stacksize = 0); /// - /// 强制终止线程。注意要避免在new和delete之间执行TerminateThread,否则程序将不能在继续使用new了。 + /// 强制终止线程。注意要避免在new和delete之间执行TerminateThread,否则程序将不能在继 + /// 续使用new了。 /// https://blog.csdn.net/anye3000/article/details/7470674 + /// 注意:尽量不要使用这个接口,应该让线程自己运行到终点,而不是手动关闭它。 /// void Kill(); @@ -51,12 +75,21 @@ namespace AsuraEngine /// /// 执行任务队列。 /// - void Execute(); + void Process(); const std::string& GetName(); + /// + /// 回调。 + /// + void Post(); + private: + //----------------------------------------------------------------------------// + + LUAX_DECL_ENUM(ThreadType); + LUAX_DECL_METHOD(_New); LUAX_DECL_METHOD(_Start); LUAX_DECL_METHOD(_Join); @@ -65,6 +98,10 @@ namespace AsuraEngine LUAX_DECL_METHOD(_IsRunning); LUAX_DECL_METHOD(_IsCurrent); LUAX_DECL_METHOD(_GetName); + LUAX_DECL_METHOD(_Sleep); + LUAX_DECL_METHOD(_Post); + + //----------------------------------------------------------------------------// ThreadImpl* mImpl; std::string mName; @@ -75,11 +112,10 @@ namespace AsuraEngine std::queue mTaskQueue; Mutex mMutex; - /// - /// 此线程的lua执行栈,为了避免和主执行栈冲突 - /// - lua_State* mState; - Luax::LuaxMemberRef mStateRef; + lua_State* mLuaThread; + + std::queue mFinishedTasks; + Mutex mFinishedMutex; }; -- cgit v1.1-26-g67d0