2019-08-31 18:54:22 +00:00
|
|
|
|
#ifndef __EX_THREAD_H__
|
2016-12-14 15:34:44 +00:00
|
|
|
|
#define __EX_THREAD_H__
|
|
|
|
|
|
2017-09-16 17:04:42 +00:00
|
|
|
|
#include "ex_str.h"
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
|
|
#ifdef EX_OS_WIN32
|
|
|
|
|
# include <process.h>
|
2016-12-14 15:34:44 +00:00
|
|
|
|
typedef HANDLE EX_THREAD_HANDLE;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
#else
|
|
|
|
|
# include <pthread.h>
|
2016-12-14 15:34:44 +00:00
|
|
|
|
typedef pthread_t EX_THREAD_HANDLE;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
2016-12-14 15:34:44 +00:00
|
|
|
|
class ExThreadManager;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
2016-12-14 15:34:44 +00:00
|
|
|
|
class ExThreadBase
|
2016-12-06 17:05:56 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2017-01-08 15:53:37 +00:00
|
|
|
|
ExThreadBase(const char* thread_name);
|
2016-12-14 15:34:44 +00:00
|
|
|
|
virtual ~ExThreadBase();
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
|
|
|
|
bool is_running(void) { return m_is_running; }
|
|
|
|
|
|
2019-08-31 18:54:22 +00:00
|
|
|
|
// 创建并启动线程(执行被重载了的run()函数)
|
2016-12-06 17:05:56 +00:00
|
|
|
|
bool start(void);
|
2019-08-31 18:54:22 +00:00
|
|
|
|
// 结束线程(等待wait_timeout_ms毫秒,如果wait_timeout_ms为0,则无限等待)
|
2016-12-06 17:05:56 +00:00
|
|
|
|
bool stop(void);
|
2019-08-31 18:54:22 +00:00
|
|
|
|
// 直接结束线程(强杀,不建议使用)
|
2016-12-06 17:05:56 +00:00
|
|
|
|
bool terminate(void);
|
|
|
|
|
|
|
|
|
|
protected:
|
2018-11-03 06:11:02 +00:00
|
|
|
|
// main loop of this thread.
|
2016-12-06 17:05:56 +00:00
|
|
|
|
virtual void _thread_loop(void) = 0;
|
2018-11-03 06:11:02 +00:00
|
|
|
|
// called by another thread when thread ready to stop.
|
|
|
|
|
virtual void _on_stop(void) {};
|
|
|
|
|
// called inside thread when thread fully stopped.
|
|
|
|
|
virtual void _on_stopped(void) {};
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
|
|
|
|
#ifdef EX_OS_WIN32
|
|
|
|
|
static unsigned int WINAPI _thread_func(LPVOID lpParam);
|
|
|
|
|
#else
|
|
|
|
|
static void* _thread_func(void * pParam);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
ex_astr m_thread_name;
|
2016-12-14 15:34:44 +00:00
|
|
|
|
EX_THREAD_HANDLE m_handle;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
bool m_is_running;
|
2018-11-03 06:11:02 +00:00
|
|
|
|
bool m_need_stop;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2019-08-31 18:54:22 +00:00
|
|
|
|
// 线程锁(进程内使用)
|
2016-12-14 15:34:44 +00:00
|
|
|
|
class ExThreadLock
|
2016-12-06 17:05:56 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2016-12-14 15:34:44 +00:00
|
|
|
|
ExThreadLock();
|
|
|
|
|
virtual ~ExThreadLock();
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
|
|
|
|
void lock(void);
|
|
|
|
|
void unlock(void);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
#ifdef EX_OS_WIN32
|
|
|
|
|
CRITICAL_SECTION m_locker;
|
|
|
|
|
#else
|
|
|
|
|
pthread_mutex_t m_locker;
|
|
|
|
|
#endif
|
|
|
|
|
};
|
|
|
|
|
|
2019-08-31 18:54:22 +00:00
|
|
|
|
// 线程锁辅助类
|
2016-12-14 15:34:44 +00:00
|
|
|
|
class ExThreadSmartLock
|
2016-12-06 17:05:56 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2016-12-14 15:34:44 +00:00
|
|
|
|
ExThreadSmartLock(ExThreadLock& lock) : m_lock(lock)
|
2016-12-06 17:05:56 +00:00
|
|
|
|
{
|
|
|
|
|
m_lock.lock();
|
|
|
|
|
}
|
2016-12-14 15:34:44 +00:00
|
|
|
|
~ExThreadSmartLock()
|
2016-12-06 17:05:56 +00:00
|
|
|
|
{
|
|
|
|
|
m_lock.unlock();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
2016-12-14 15:34:44 +00:00
|
|
|
|
ExThreadLock& m_lock;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-12-14 15:34:44 +00:00
|
|
|
|
typedef std::list<ExThreadBase*> ex_threads;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
2016-12-14 15:34:44 +00:00
|
|
|
|
class ExThreadManager
|
2016-12-06 17:05:56 +00:00
|
|
|
|
{
|
2016-12-14 15:34:44 +00:00
|
|
|
|
friend class ExThreadBase;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
|
|
|
|
public:
|
2016-12-14 15:34:44 +00:00
|
|
|
|
ExThreadManager();
|
|
|
|
|
virtual ~ExThreadManager();
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
|
|
|
|
void stop_all(void);
|
|
|
|
|
|
2017-01-08 15:53:37 +00:00
|
|
|
|
//private:
|
|
|
|
|
void add(ExThreadBase* tb);
|
|
|
|
|
void remove(ExThreadBase* tb);
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
|
|
|
|
private:
|
2016-12-14 15:34:44 +00:00
|
|
|
|
ExThreadLock m_lock;
|
|
|
|
|
ex_threads m_threads;
|
2016-12-06 17:05:56 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2019-08-31 18:54:22 +00:00
|
|
|
|
// 原子操作
|
2016-12-14 15:34:44 +00:00
|
|
|
|
int ex_atomic_add(volatile int* pt, int t);
|
|
|
|
|
int ex_atomic_inc(volatile int* pt);
|
|
|
|
|
int ex_atomic_dec(volatile int* pt);
|
2016-12-06 17:05:56 +00:00
|
|
|
|
|
2019-08-31 18:54:22 +00:00
|
|
|
|
// 线程相关操作
|
2017-01-08 15:53:37 +00:00
|
|
|
|
ex_u64 ex_get_thread_id(void);
|
|
|
|
|
|
2016-12-14 15:34:44 +00:00
|
|
|
|
#endif // __EX_THREAD_H__
|