99 lines
2.2 KiB
C++
99 lines
2.2 KiB
C++
#ifndef __UT_THREAD_POOL_HPP__
|
|
#define __UT_THREAD_POOL_HPP__
|
|
|
|
#include <unitree/common/log/log.hpp>
|
|
#include <unitree/common/thread/thread.hpp>
|
|
#include <unitree/common/thread/thread_task.hpp>
|
|
#include <unitree/common/block_queue.hpp>
|
|
|
|
namespace unitree
|
|
{
|
|
namespace common
|
|
{
|
|
class ThreadPool
|
|
{
|
|
public:
|
|
enum
|
|
{
|
|
/*
|
|
* minimum threads can be created.
|
|
*/
|
|
MIN_THREAD_NUMBER = 1,
|
|
/*
|
|
* maximum threads can be created.
|
|
*/
|
|
MAX_THREAD_NUMBER = 1000,
|
|
/*
|
|
* default timeout get task from blockqueue.
|
|
* 1 second
|
|
*/
|
|
QUEUE_GET_TIMEOUT_MICROSEC = 1000000,
|
|
/*
|
|
* default max queue size.
|
|
* as UT_QUEUE_MAX_LEN
|
|
*/
|
|
MAX_QUEUE_SIZE = UT_QUEUE_MAX_LEN,
|
|
/*
|
|
* default in queue time in microsecond.
|
|
* 7 days
|
|
*/
|
|
MAX_QUEUE_MICROSEC = 25200000000
|
|
};
|
|
|
|
explicit ThreadPool(uint32_t threadNumber = MIN_THREAD_NUMBER,
|
|
uint32_t queueMaxSize = UT_QUEUE_MAX_LEN,
|
|
uint64_t taskMaxQueueMicrosec = MAX_QUEUE_MICROSEC);
|
|
|
|
__UT_THREAD_DECL_TMPL_FUNC_ARG__
|
|
bool AddTask(__UT_THREAD_TMPL_FUNC_ARG__)
|
|
{
|
|
return AddTaskInner(ThreadTaskPtr(new ThreadTask(__UT_THREAD_BIND_FUNC_ARG__)));
|
|
}
|
|
|
|
__UT_THREAD_DECL_TMPL_FUNC_ARG__
|
|
FuturePtr AddTaskFuture(__UT_THREAD_TMPL_FUNC_ARG__)
|
|
{
|
|
ThreadTaskFuturePtr taskPtr = ThreadTaskFuturePtr(
|
|
new ThreadTaskFuture(__UT_THREAD_BIND_FUNC_ARG__));
|
|
|
|
if (AddTaskInner(std::dynamic_pointer_cast<ThreadTask>(taskPtr)))
|
|
{
|
|
return taskPtr->GetFuture();
|
|
}
|
|
|
|
return FuturePtr();
|
|
}
|
|
|
|
int32_t DoTask();
|
|
uint64_t GetTaskSize();
|
|
|
|
bool IsQuit();
|
|
void Quit(bool waitThreadExit = true);
|
|
|
|
bool IsTaskOverdue(uint64_t enqueueTime);
|
|
|
|
private:
|
|
bool AddTaskInner(ThreadTaskPtr taskptr);
|
|
|
|
void InitCreateThread();
|
|
void WaitThreadExit();
|
|
|
|
private:
|
|
volatile bool mQuit;
|
|
|
|
uint32_t mThreadNumber;
|
|
uint32_t mTaskQueueMaxSize;
|
|
uint64_t mTaskMaxQueueTime;
|
|
|
|
BlockQueue<ThreadTaskPtr> mTaskQueue;
|
|
std::vector<ThreadPtr> mThreadList;
|
|
|
|
Logger* mLogger;
|
|
};
|
|
|
|
typedef std::shared_ptr<ThreadPool> ThreadPoolPtr;
|
|
|
|
}
|
|
}
|
|
#endif//__UT_THREAD_POOL_HPP__
|