#ifndef HEADER_BASE_RUNNABLESHARETASKLIST #define HEADER_BASE_RUNNABLESHARETASKLIST #include #include #include "TaskQueue.h" namespace base { typedef std::function Task; template class CRunnableShareTaskList : public CRunnable { public: explicit CRunnableShareTaskList(int channel); virtual ~CRunnableShareTaskList(); int GetTaskListSize() { std::unique_lock lock(_map_mutex); return _task_list_map[_channel].first->Size(); } //post task void Push(const T&& func) { std::unique_lock lock(_map_mutex); _task_list_map[_channel].first->Push(func); } void Push(const T& func) { std::unique_lock lock(_map_mutex); _task_list_map[_channel].first->Push(func); } //TO DO virtual void Run() = 0; private: T _Pop() { return std::move(_task_list_map[_channel].first->Pop()); } CRunnableShareTaskList(const CRunnableShareTaskList&) = delete; CRunnableShareTaskList& operator=(const CRunnableShareTaskList&) = delete; private: int _channel; bool _stop; std::shared_ptr _pthread; static std::mutex _map_mutex; static std::map>, int>> _task_list_map; //shared task queue. channel. TaskQueue. TaskQueue num. }; template std::mutex CRunnableShareTaskList::_map_mutex; template std::map>, int>> CRunnableShareTaskList::_task_list_map; template CRunnableShareTaskList::CRunnableShareTaskList(int channel) : _stop(false), _channel(channel) { std::unique_lock lock(_map_mutex); auto iter = _task_list_map.find(_channel); if (iter != _task_list_map.end()) { iter->second.second++; } else { _task_list_map[_channel] = std::make_pair(std::shared_ptr>(new CTaskQueue), 1); } } template CRunnableShareTaskList::~CRunnableShareTaskList() { std::unique_lock lock(_map_mutex); auto iter = _task_list_map.find(_channel); if (iter != _task_list_map.end()) { iter->second.second--; if (iter->second.second == 0) { _task_list_map.erase(iter); } } } } #endif