C++多线程03 Lambda表达式与caII once
一、Lambda表达式做为线程入口
Lambda(匿名函数)表达式是C++11最重要的特性之一,lambda来源于函数式编程的概念,也是现代编程语言的一个特点。
优点如下:
声明式编程风格:就地匿名定义目标函数或函数对象,有更好的可读性和可维护性。
简洁:不需要额外写一个命名函数或函数对象,,避免了代码膨胀和功能分散。
更加灵活:在需要的时间和地点实现功能闭包。
概念及基本用法
lambda表达式定义了一个匿名函数,并且可以捕获一定范围内的变量。语法形式如下:
[ capture ] ( params ) opt -> ret { body; };
1
capture:捕获列表
params:参数列表
opt:函数选项
ret:返回值类型
body:函数体
一个完整的lambda表达式是这样:
auto f = [](int a) -> int {return a + 1;};
cout << f(3) << endl; //输出4
详细版本原文链接:https://blog.csdn.net/luoyayun361/article/details/123491439
直接定义一个线程对象:
};
int main(int argc, char* argv[])
{thread th([](int i) {cout << "test lmbda " << i << endl; },123);return 0;
}
[](int i) {cout << "test lmbda " << i << endl; 相当于函数指针,指向一个打印test lmbda i的函数,i的值由第二个参数先拷贝,再传给这个指针指向的函数
用对象做为一个线程
class TestLambda
{public:void Start(){thread th([this]() {cout << "name = " << name << endl; });th.join();}string name = "test lambda";
};
int main(int argc, char* argv[])
{TestLambda test;test.Start();return 0;
}
先创建一个对象,该对象有一个成员name
再调用该类的start方法,该方法将一个Lambda表达式包装成线程,并让该线程阻塞主线程,该Lambda表达式做为线程入口,捕获列表捕获了该对象的this指针,指明了打印哪个对象的name
二、caII once多线程函数调用,但函数只进入一次
比如多个线程都要初始化一个库,但只需要进入一次,可以使用个全局变量来进行判断,一旦有一个线程对其初始化了便将其设为false,其他线程便进不去了,但这样效率偏低,并且影响代码可读性,于是使用一个新的方法:
std::call_once():
该函数的第一个参数为标记,第二个参数是一个函数名。
功能:能够保证多线程调用函数func()时只被调用一次。具备互斥量的能力,而且比互斥量消耗的资源更少,更高效。
call_once()需要与一个标记结合使用,这个标记为std::once_flag;其中once_flag是一个数据结构,call_once()就是通过标记来决定函数是否执行,调用成功后,就把标记设置为一种已调用状态。
于是将想只调用一次的函数用call_once()进行包装
void SystemInit()
{cout << "Call SystemInit" << endl;
}void SystemInitOne()
{static std::once_flag flag;std::call_once(flag, SystemInit);
}
int main(int argc, char* argv[])
{SystemInitOne();SystemInitOne();for (int i = 0; i < 3; i++){thread th(SystemInitOne);th.detach();}getchar();return 0;
}
可以看到,虽然for遍历了三次,但只调用了一次:
C++多线程03 Lambda表达式与caII once相关推荐
- 五、Java中常用的API(通过包进行分类)————异常、多线程和Lambda表达式
之前已经介绍了java.lang包下的相关类,今天将要补充两个常用的API:java.lang.Throwable和java.lang.Thread 一.异常(java.lang.Throwable) ...
- C++多线程:Lambda表达式
定义 Lambda 表达式可以说是c++11引用的最重要的特性之一,虽然跟多线程关系不大,但是它在多线程的场景下使用很频繁,所以在多线程这个主题下介绍它更合适.Lambda 来源于函数式编程的概念,也 ...
- Java多线程:Lambda 表达式
什么是Lambda 表达式 Lambda 表达式,也可称为闭包,它是Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...
- 【Java Lambda表达式】Lambda表达式详解、Lambda表达式的等效使用方式、多线程
1.静态内部类 静态内部类,属于类中的类,好处是:如果不使用,就不会被编译. 如果把这个类放到方法中,成为局部内部类(看下一部分) package cn.hanquan.test;/*Lambda表达 ...
- Java基础---学Java怎么能不了解多线程---Lambda表达式
多线程 程序,进程,线程 1.程序(program):一个固定的运行逻辑和数据的集合,是一个静态的概念,一般都存储在磁盘中 2.进程(process):一个正在运行的程序,是一个程序的一次运行,是一个 ...
- Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)
Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...
- 多线程-静态代理-Lambda表达式
文章目录 多线程 进程和线程 (Process and Thread) 线程 实现线程的三种方式 继承Thread类 实现Runable接口 实现Callable接口 静态代理 Thread底层实现方 ...
- 多线程、线程池以及Lambda表达式的总结笔记分享
文章目录 1. 多线程技术 1.1 线程与进程 1.2 守护线程和用户线程 1.3 线程的六种状态 1.4 线程的调度 1.5 同步与异步 1.6 并发与并行 1.7 Thread类 1.7.1 Th ...
- 【JAVA黑马程序员笔记】四 P314到P384(特殊流、多线程编程、网络编程模块、lambda表达式、接口组成更新、方法引用、函数式接口)
P314-315 字节/符打印流 PrintStream ps = new PrintStream("test.txt");//使用字节输出流的方法ps.write(97);// ...
- lambda表达式——写多线程
JDK1.8 中Lambda 表达式的出现,基本可以取替原来的匿名类实现多线程的方式.下面列举常用的常用的三种情况. 一.普通开启异步线程 new Thread(() -> System.out ...
最新文章
- 022 Spark shuffle过程
- [转]设置 UILabel 和 UITextField 的 Padding 或 Insets
- jmeter 核心_初识性能测试工具JMeter
- 【转载】十年学会编程
- TomcatServlet笔记
- Java 整数型的进制间的互相转换
- Windows phone 7应用之代码性能分析工具——Profile.
- 斑能不能彻底去掉_鸡脖、猪脖子上有淋巴结,会有大量毒素、病菌?还能不能放心吃?...
- linux java7 64位_linux jdk1.7 64位tar.gz下载安装配置教程(完美版)
- python-贪心算法
- 1.maya基本操作
- 【帝国CMS】灵动标签SQL调用广告系统里的广告
- 虚拟机服务器安装虚拟机的步骤
- i9 10900k和i7 9700k的区别大吗
- 【论文分享】ACL 2020 神经网络的可解释性
- 计算机一级怎么截图保存到桌面,怎么截屏电脑桌面
- python实现打卡
- 中国IT研发实力最强的城市分析(转载)
- 嵌入式系统开发设计---嵌入式系统开发设计
- java文件快速扫描仪_java扫描仪上传文件
热门文章
- Visual Studio2019配置备忘
- Java实现数学概率C ( a , b )
- AI英雄 | 论人工智能与自由意志,请看尤瓦尔与李飞飞的这场“激辩”
- 开新林哲自曝:打造二手车全球经营
- lpush rpush 区别_php-redis中文参考手册_list容器相关_lPush_rPush_lPushx_rPu...
- Element-UI下拉框select实现拼音搜索
- 互联网日报 | 农夫山泉正式登陆港交所;飞猪推出旅游业首个百亿补贴;苹果秋季发布会正式官宣...
- msg1500说明书_瑞斯康达MSG1500 路由 刷机 保姆级教程
- 【Scratch案例实操】scratch西游记师徒谁人气高 scratch编程案例教学 scratch创意编程 少儿编程教案
- RE文件管理器如何获取小程序APKG文件