多线程的创建(3)
lambda临时函数作为线程入口函数
- lambda函数的基本格式
- [捕捉列表](参数)mutable throw()-> 返回值类型 { 函数体 }
- [捕捉列表]也成为lambda函数导入器,实际上,[]是lambda引出符,编译器根据该引出符判断接下来的代码是否是lambda函数,捕获列表能够捕捉上下文中的变量以供lambda函数使用。
- 参数列表与普通函数的参数列表一直。如果不需要参数传递,则可以连同括号()一起省略。
- 可变规格,mutable修饰符,默认情况下lambda函数总是一个const函数,mutable可以取消其常量性,在使用该修饰符时,参数列表不可省略(即使参数为空)
- 异常说明:用于lambda表达式内部函数抛出异常
- 返回值类型:追踪返回值类型形式声明的返回类型。在不需要返回值的时候可以连同“->”一起省略,此外,在返回类型明确的情况下,可以省略该部分,让编译器对返回类型进行推导。
- lambda函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。
- 当使用线程去完成一些简单的任务时,可以使用lambda函数作为线程入口函数。
lambda线程示例
普通全局函数的lambda表达式
#include<iostream>
#include<string>
#include<thread>
using namespace std;
int main(int argc, char** argv)
{
thread th([](int i){cout << "test lambda" << i << endl;},
123);
th.join();
return 0;
}
类成员函数的lambda表达式
#include<iostream>
#include<string>
#include<thread>
using namespace std;
class TestLambda
{
public:
void Start(int age)
{
thread th([this](int age) {cout << "name = " << name << "age = " << age << endl; }, age);
th.join();
}
string name = "Test lambda";
int age = 0;
};
int main(int argc, char** argv)
{
TestLambda th;
th.Start(23);
return 0;
}