背景:
最近看了罗能大佬的关于可变参数模版的教程,下边是教程中对应thread源码,在它的基础上完善了一些功能
代码
#include <iostream>
#include <memory>
#include <tuple>
#include <pthread.h>
struct thread{
template<typename F, typename ...Args>
thread(F f, Args ...args)
{
using FnArgs = std::tuple<F, std::tuple<Args...>>;
std::unique_ptr<FnArgs> uniFnArgs {new FnArgs(f, {args...})};
int res = pthread_create(&_thread, nullptr, [](void *pUserData)->void *{
std::unique_ptr<FnArgs> uniFnArgs{static_cast<FnArgs*>(pUserData)};
auto &[f, args] = *uniFnArgs;
std::apply(f, args);
return nullptr;
}, uniFnArgs.get());
if (res == 0)
{
uniFnArgs.release();
}
}
void join()
{
pthread_join(_thread, nullptr);
}
private:
pthread_t _thread;
};
void print(int a, double b, char c)
{
std::cout<<a<<b<<c<<std::endl;
}
int main()
{
thread th(print, 1, 2.0, 'A');
th.join();
return 0;
}
上边代码逻辑还是比较清晰的,thread 构造方法,一个函数,其他可变参数,然后把这参数打包成tuple,在和函数一起打包成tuple,pthread创建线程后把,把创建的unique_ptr,里边的指针传递给线程里边,线程里边在做解包操作,最终用apply进行调用。