如何优雅的写C++代码 Obotcha介绍(Lambda支持)

  这个春节在家开始优化多线程的代码,发现多线程的使用上比较不方便,例如:我要创建一个线程,需要如下的步骤:

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实现代码如下:

Thread代码

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值