#ifndef LLMR_UTIL_THREADPOOL #define LLMR_UTIL_THREADPOOL #include #include #include #include #include "std.hpp" namespace llmr { namespace util { class Threadpool { private: class Worker { public: Worker(Threadpool& pool, const std::string name); ~Worker(); static void *loop(void *ptr); private: Threadpool& pool; const std::string name; pthread_t thread; }; public: Threadpool(int max_workers = 4); typedef void (*Callback)(void *); void add(Callback callback, void *data); private: typedef std::pair Task; const int max_workers; pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; pthread_cond_t condition = PTHREAD_COND_INITIALIZER; std::forward_list workers; int worker_count = 0; std::queue tasks; }; extern std::unique_ptr threadpool; } } #endif