summaryrefslogtreecommitdiff
path: root/source/libs/asura-lib-utils/threading/thread.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-03-29 22:28:40 +0800
committerchai <chaifix@163.com>2019-03-29 22:28:40 +0800
commit157530b8b6e11efc5573d5a0db8987a440197aa1 (patch)
treef9df79c013885e13dc81e7046c9828037eb29e2e /source/libs/asura-lib-utils/threading/thread.h
parente37b1dfd022bda4dfdcba243c0543c62c89db32f (diff)
*misc
Diffstat (limited to 'source/libs/asura-lib-utils/threading/thread.h')
-rw-r--r--source/libs/asura-lib-utils/threading/thread.h108
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;