123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #ifndef THREADPOOL_H
- #define THREADPOOL_H
- #include <list>
- #include <thread>
- #include <condition_variable>
- #include <queue>
- #include <functional>
- #include <atomic>
- #include <map>
- #include <future>
- #define CPPTP ThreadPool::getInstance()
- class ThreadPool
- {
- private:
- ThreadPool();
- ThreadPool(const ThreadPool &tp) = delete;
- ThreadPool &operator=(const ThreadPool &tp) = delete;
- public:
-
- static ThreadPool& getInstance()
- {
- static ThreadPool tp;
- return tp;
- }
- ~ThreadPool();
-
- template <typename F, typename... Args>
- void add_task(F &&f, Args &&...args)
- {
-
- std::function<void()> task = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
-
- {
- std::unique_lock<std::mutex> lock(m_mutexTask);
- m_queue_Tasks.emplace(std::move(task));
- }
-
- m_cond_Task.notify_one();
- }
-
- template<typename F, typename... Args>
- auto add_task_with_ret(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type>
- {
-
- using resultType = typename std::result_of<F(Args...)>::type;
-
- auto task = std::make_shared<std::packaged_task<resultType()>>(
-
- std::bind(std::forward<F>(f), std::forward<Args>(args)...)
- );
-
- std::future<resultType> res = task->get_future();
- {
- std::unique_lock<std::mutex> lock(m_mutexTask);
-
- m_queue_Tasks.emplace([task](){
- (*task)();
- });
- }
-
- m_cond_Task.notify_one();
-
- return res;
- }
-
- int getThreadMaxNum();
- void setThreadMaxNum(int num);
- int getThreadMiniNum();
- void setThreadMiniNum(int num);
- int getThreadIdleNum();
- int getThreadRunNum();
- int getThreadLiveNum();
- int getThreadAddNum();
- void setThreadAddNum(int num);
- int getThreadMiniIdle();
- void setThreadMiniIdle(int num);
- int getThreadMaxIdle();
- void setThreadMaxIdle(int num);
- private:
- void worker();
- void managerThread();
- void createThread(int num);
- void clearThread();
- private:
- class OneThread;
- std::map<std::thread::id, std::thread> m_mapThreads;
- std::list<std::thread::id> m_exitThreadID;
- std::queue<std::function<void(void)>> m_queue_Tasks;
- std::condition_variable m_cond_Task;
- bool m_stop;
- std::mutex m_mutexExitThreadID;
- std::mutex m_mutexTask;
- std::thread m_managerThread;
- int m_threadMaxNum = 256;
- int m_threadMiniNum = 5;
- std::atomic<int> m_threadAddNum;
- std::atomic<int> m_threadMiniIdle;
- std::atomic<int> m_threadMaxIdle;
- std::atomic<int> m_threadRunNum;
- std::atomic<int> m_threadLiveNum;
- std::atomic<int> m_threadExitNum;
- };
- #endif
|