这个春节在家开始优化多线程的代码,发现多线程的使用上比较不方便,例如:我要创建一个线程,需要如下的步骤:
1.创建一个Runnable的子类。如果有参数传递,那需要在构造函数中进行赋值
DECLARE_SIMPLE_CLASS(RunCase2) IMPLEMENTS(Runnable) {
public:
_RunCase2(int v) {
value = v;
}
void run() {
//xxxxxxxx
}
private:
int RunCase2;
};
2.创建Thread实例,并且创建RunCase2的实例。
Thread t = createThread(createRunCase2(10));
t->start();
一个简单的多线程代码需要创建一个类,如果有不同的操作,后面可能会有非常多的类,代码非常冗余,而且不易阅读。所以这里就要推出lambda表达式~。
谈起lambda,哈哈,以前非常的排斥,主要原因是出异常的时候比较难debug,特别是java出现异常的时候经常有点摸不着头脑。但是现在用过lambda之后,才发现代码非常简洁,真香。上面的代码可以用lambda表示:
Thread t = createThread([](int value) {
//xxxxx
}),10);
好了,结束。是不是非常的简介,一目了然,而且不需要新写一个类,感觉帮忙的。香的不得了~~。接下来,我们看一下Obotcha的lambda是如何实现的:
template< class Function, class... Args >
_Thread( Function&& f, Args&&... args ):_Thread() {
mRunnable = createLambdaRunnable(f,args...);
}
Thread的实例化,实际上就是将lambda函数和参数传给Runnable构造函数
1.LambdaRunnable构造函数使用了std::tuple来保存了参数,函数用Function保存
_LambdaRunnable(Function &&f,Args&&... args):_Runnable(),func(f),_arguments(std::make_tuple(args...)) {
}
2.当Thread内部调用LambdaRunnable的run时,再回调步骤1中保存的Function
void run() {
//func(initializer_list(_arguments));
ostd::apply(func,_arguments);
}
3.这里ostd::apply是一个将tuple解开的函数,如果服务器的g++支持C++17,那我们可以使用std::apply。
好了,相关的多线程lambda实现代码如下:
谢谢