summaryrefslogtreecommitdiff
path: root/source/libs/asura-lib-utils/threading/thread.h
blob: 39289639c29df268c1d78e3b967715e2ce363c9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#ifndef __ASURA_THREAD_H__
#define __ASURA_THREAD_H__

#include <string>
#include <queue>

#include <asura-lib-utils/scripting/portable.hpp>

#include "task.h"
#include "mutex.h"

namespace AsuraEngine
{
	namespace Threading
	{

		class ThreadImpl;

		///
		/// ̵߳ļֲͬʵ֣
		///     1: Deferredӳģʽ߳ϵɺҪ̵ֶ߳Post
		///        ̵߳ص첽Ϊͬ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,
		};

		///
		/// ߳壬ÿ߳άһtask queue
		///
		class Thread ASURA_FINAL
			: public AEScripting::Portable<Thread>
		{
		public:

			LUAX_DECL_FACTORY(Thread);

			Thread(ThreadType type, Luax::LuaxState& luaThread, const std::string& name = "");
			~Thread();

			bool AddTask(Task* task);

			void Start(uint32 stacksize = 0);

			///
			/// ǿֹ̡߳עҪnewdeleteִ֮TerminateThread򽫲ڼ
			/// ʹnewˡ
			/// https://blog.csdn.net/anye3000/article/details/7470674
			/// ע⣺ҪʹӿڣӦ߳Լеյ㣬ֶر
			///
			void Kill();

			///
			/// ̵߳ȴ߳̽żִС
			///
			void Join();

			bool IsRunning();

			bool IsCurrent();

			///
			/// ִС
			///
			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);
			LUAX_DECL_METHOD(_Kill);
			LUAX_DECL_METHOD(_AddTask);
			LUAX_DECL_METHOD(_IsRunning);
			LUAX_DECL_METHOD(_IsCurrent);
			LUAX_DECL_METHOD(_GetName);
			LUAX_DECL_METHOD(_Sleep);
			LUAX_DECL_METHOD(_Post);
			LUAX_DECL_METHOD(_GetType);

			//----------------------------------------------------------------------------//

			ThreadImpl* mImpl;
			std::string mName;
			ThreadType  mType;

			///
			/// С
			///
			std::queue<Task*> mTaskQueue;
			Mutex             mMutex;

			lua_State*        mLuaThread;

			std::queue<Task*> mFinishedTasks;
			Mutex             mFinishedMutex;

		};

		///
		/// ̵߳ľʵ֣û͸ģһ׼ֲԣ
		///     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 bool IsRunning() = 0;
			virtual bool IsCurrent() = 0;

		};

	}
}

#endif