#ifndef LIBAPI_PROCESS_THREAD_H #define LIBAPI_PROCESS_THREAD_H #include #include #include #include #include #include #include #include "LibapiThread.h" #include "LibapiQueue.h" #include "LibapiQueues.h" struct Signal { int id; bool end = false; }; class LibapiProcessThread; typedef LibapiProcessThread ProThread; typedef std::shared_ptr SharedThread; // 全局线程管理 static std::vector shared_threads; static std::mutex g_mutex; class LibapiProcessThread : public LibapiThread { public: static std::vector* get_shared_threads() { return &shared_threads; }; template static std::shared_ptr create(std::string thread_name = "") { std::unique_lock locker(g_mutex); T* plugin = new T(); std::string type_name; if (thread_name == "") type_name = typeid(plugin).name(); else type_name = thread_name; SharedThread ptr = std::make_shared(-1, type_name,(IRunnable*)plugin); shared_threads.push_back(ptr); return ptr; }; template static std::shared_ptr create_and_start(std::string thread_name = "") { std::unique_lock locker(g_mutex); T* plugin = new T(); std::string type_name; if (thread_name == "") type_name = typeid(plugin).name(); else type_name = thread_name; SharedThread ptr = std::make_shared(-1, type_name, (BaseRunnable*)plugin); ptr->start(); shared_threads.push_back(ptr); return ptr; }; public: LibapiProcessThread(int id, std::string name, BaseRunnable* runnable); virtual ~LibapiProcessThread(); void set_parent_thread(LibapiProcessThread* pThread); void add_sub_thread(LibapiProcessThread* pParentThread); void set_next_thread(LibapiProcessThread* pSubThread); void update_sub_thread_signal(LibapiProcessThread* pThread); void run(); // override function private: void reset_sub_thread_signal(std::vector& sub_thread_signal); bool check_all_sub_complete(); private: LibapiProcessThread* m_parent = NULL; std::vector m_sub_threads; std::vector m_sub_thread_signal; //LibapiProcessThread* m_next_thread = NULL; std::vector m_next_threads; int m_cur_index = 0; std::mutex m_sig_mutex; }; #endif // LIBAPITHREAD_H