teleport/common/libex/include/ex/ex_thread.h

121 lines
2.1 KiB
C
Raw Normal View History

#ifndef __EX_THREAD_H__
#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>
typedef HANDLE EX_THREAD_HANDLE;
2016-12-06 17:05:56 +00:00
#else
# include <pthread.h>
typedef pthread_t EX_THREAD_HANDLE;
2016-12-06 17:05:56 +00:00
#endif
class ExThreadManager;
2016-12-06 17:05:56 +00:00
class ExThreadBase
2016-12-06 17:05:56 +00:00
{
public:
ExThreadBase(const char* thread_name);
virtual ~ExThreadBase();
2016-12-06 17:05:56 +00:00
bool is_running(void) { return m_is_running; }
// 创建并启动线程执行被重载了的run()函数)
2016-12-06 17:05:56 +00:00
bool start(void);
// 结束线程等待wait_timeout_ms毫秒如果wait_timeout_ms为0则无限等待
2016-12-06 17:05:56 +00:00
bool stop(void);
// 直接结束线程(强杀,不建议使用)
2016-12-06 17:05:56 +00:00
bool terminate(void);
protected:
// main loop of this thread.
2016-12-06 17:05:56 +00:00
virtual void _thread_loop(void) = 0;
// 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;
EX_THREAD_HANDLE m_handle;
2016-12-06 17:05:56 +00:00
bool m_is_running;
bool m_need_stop;
2016-12-06 17:05:56 +00:00
};
// 线程锁(进程内使用)
class ExThreadLock
2016-12-06 17:05:56 +00:00
{
public:
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
};
// 线程锁辅助类
class ExThreadSmartLock
2016-12-06 17:05:56 +00:00
{
public:
ExThreadSmartLock(ExThreadLock& lock) : m_lock(lock)
2016-12-06 17:05:56 +00:00
{
m_lock.lock();
}
~ExThreadSmartLock()
2016-12-06 17:05:56 +00:00
{
m_lock.unlock();
}
private:
ExThreadLock& m_lock;
2016-12-06 17:05:56 +00:00
};
typedef std::list<ExThreadBase*> ex_threads;
2016-12-06 17:05:56 +00:00
class ExThreadManager
2016-12-06 17:05:56 +00:00
{
friend class ExThreadBase;
2016-12-06 17:05:56 +00:00
public:
ExThreadManager();
virtual ~ExThreadManager();
2016-12-06 17:05:56 +00:00
void stop_all(void);
//private:
void add(ExThreadBase* tb);
void remove(ExThreadBase* tb);
2016-12-06 17:05:56 +00:00
private:
ExThreadLock m_lock;
ex_threads m_threads;
2016-12-06 17:05:56 +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
// 线程相关操作
ex_u64 ex_get_thread_id(void);
#endif // __EX_THREAD_H__