You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

145 lines
2.6 KiB

#include <iostream>
#include <stdexcept>
#include "tiny_pool.h"
#include <unistd.h>
#include <future>
#include <functional>
void demo_func(void *arg) {
std::cout << *(int*)arg << std::endl;
sleep(1);
}
int test_func(char c) {
printf("char -> `%c`\n", c);
return 233;
}
void convert(void *f) {
// auto *func = ( std::function<void()> * ) f;
//
// (*func)();
( *static_cast< std::function<void()>* >(f) )();
// auto t = (std::function<void(void*)>*)task;
//
// (*t)(NULL);
free(f);
}
class TinyPool {
pool_t *pool;
public:
TinyPool(uint32_t size);
~TinyPool();
template <typename Func, typename ...Args>
auto submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))> {
std::function<decltype(func(args...))()> wrap_func = std::bind(
std::forward<Func>(func), std::forward<Args>(args)...
);
auto func_ptr = std::make_shared<
std::packaged_task<decltype(func(args...))()>
>(wrap_func);
// std::function<void(void*)> task_func = [func_ptr](void*) {
// (*func_ptr)();
// };
auto *t = new std::function<void()>;
*t = [func_ptr](){
(*func_ptr)();
};
// TODO: run task_func
// (*t)();
// convert( (void*)t );
// auto t = reinterpret_cast<void(void*)>(task_func);
tiny_pool_submit(pool, convert, (void*)t);
return func_ptr->get_future();
}
void boot() {
tiny_pool_boot(pool);
}
};
TinyPool::TinyPool(uint32_t size) {
pool = tiny_pool_create(size);
// if (pool == (void*)0) { // NULL in c-style
// throw std::runtime_error("thread pool create error");
// }
}
TinyPool::~TinyPool() {
tiny_pool_kill(pool);
}
int main() {
std::cout << "tiny thread pool demo start" << std::endl;
auto p = TinyPool(1);
auto f = p.submit(test_func, 'A');
p.boot();
std::cout << "get future: " << f.get() << std::endl;
// auto f = submit(test_func, 'D');
// auto pool = tiny_pool_create(3);
// int dat[] = {0, 1, 2, 3, 4, 5, 6};
// tiny_pool_submit(pool, demo_func, (void*)&dat[0]);
// tiny_pool_submit(pool, demo_func, (void*)&dat[1]);
// tiny_pool_submit(pool, demo_func, (void*)&dat[2]);
// tiny_pool_submit(pool, demo_func, (void*)&dat[3]);
// tiny_pool_submit(pool, demo_func, (void*)&dat[4]);
// tiny_pool_submit(pool, demo_func, (void*)&dat[5]);
// tiny_pool_submit(pool, demo_func, (void*)&dat[6]);
//
// tiny_pool_boot(pool);
//
// tiny_pool_join(pool);
sleep(10);
std::cout << "tiny thread pool demo exit" << std::endl;
return 0;
}