diff --git a/demo/cpp/demo.cc b/demo/cpp/demo.cc index 25a6109..84aef41 100644 --- a/demo/cpp/demo.cc +++ b/demo/cpp/demo.cc @@ -2,11 +2,12 @@ #include #include "tiny_pool.h" -class TinyPool { +class TinyPool { // OOP for tiny_thread_pool pool_t *pool; - static void wrap_c_func(void *func) { - (*static_cast*>(func))(); - free(func); + static void wrap_c_func(void *func) { // wrap std::function as c-style function ptr + auto func_ptr = static_cast*>(func); + (*func_ptr)(); + delete func_ptr; // free lambda function } public: @@ -17,25 +18,22 @@ public: explicit TinyPool(uint32_t size) { pool = tiny_pool_create(size); } template - auto submit(Func &&func, Args &&...args) -> std::future; + auto submit(Func &&func, Args &&...args) -> std::future { // submit new task + std::function wrap_func = std::bind( + std::forward(func), std::forward(args)... // wrap as a function without params + ); + auto func_ptr = std::make_shared< + std::packaged_task // function task as shared ptr + >(wrap_func); + tiny_pool_submit(pool, TinyPool::wrap_c_func, (void*)( // submit with thread pool interface + new std::function ( + [func_ptr]() { (*func_ptr)(); } // create lambda for running task + ) + )); + return func_ptr->get_future(); // return future object + } }; -template -auto TinyPool::submit(Func &&func, Args &&...args) -> std::future { - std::function wrap_func = std::bind( - std::forward(func), std::forward(args)... - ); - auto func_ptr = std::make_shared< - std::packaged_task - >(wrap_func); - tiny_pool_submit(pool, TinyPool::wrap_c_func, (void*)( - new std::function ( - [func_ptr]() { (*func_ptr)(); } - ) - )); - return func_ptr->get_future(); -} - /// ------------------------------------ start test ------------------------------------ #include