#ifndef __UT_THREAD_POOL_HPP__ #define __UT_THREAD_POOL_HPP__ #include #include #include #include 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(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 mTaskQueue; std::vector mThreadList; Logger* mLogger; }; typedef std::shared_ptr ThreadPoolPtr; } } #endif//__UT_THREAD_POOL_HPP__