一、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相关推荐

  1. 五、Java中常用的API(通过包进行分类)————异常、多线程和Lambda表达式

    之前已经介绍了java.lang包下的相关类,今天将要补充两个常用的API:java.lang.Throwable和java.lang.Thread 一.异常(java.lang.Throwable) ...

  2. C++多线程:Lambda表达式

    定义 Lambda 表达式可以说是c++11引用的最重要的特性之一,虽然跟多线程关系不大,但是它在多线程的场景下使用很频繁,所以在多线程这个主题下介绍它更合适.Lambda 来源于函数式编程的概念,也 ...

  3. Java多线程:Lambda 表达式

    什么是Lambda 表达式 Lambda 表达式,也可称为闭包,它是Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...

  4. 【Java Lambda表达式】Lambda表达式详解、Lambda表达式的等效使用方式、多线程

    1.静态内部类 静态内部类,属于类中的类,好处是:如果不使用,就不会被编译. 如果把这个类放到方法中,成为局部内部类(看下一部分) package cn.hanquan.test;/*Lambda表达 ...

  5. Java基础---学Java怎么能不了解多线程---Lambda表达式

    多线程 程序,进程,线程 1.程序(program):一个固定的运行逻辑和数据的集合,是一个静态的概念,一般都存储在磁盘中 2.进程(process):一个正在运行的程序,是一个程序的一次运行,是一个 ...

  6. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

  7. 多线程-静态代理-Lambda表达式

    文章目录 多线程 进程和线程 (Process and Thread) 线程 实现线程的三种方式 继承Thread类 实现Runable接口 实现Callable接口 静态代理 Thread底层实现方 ...

  8. 多线程、线程池以及Lambda表达式的总结笔记分享

    文章目录 1. 多线程技术 1.1 线程与进程 1.2 守护线程和用户线程 1.3 线程的六种状态 1.4 线程的调度 1.5 同步与异步 1.6 并发与并行 1.7 Thread类 1.7.1 Th ...

  9. 【JAVA黑马程序员笔记】四 P314到P384(特殊流、多线程编程、网络编程模块、lambda表达式、接口组成更新、方法引用、函数式接口)

    P314-315 字节/符打印流 PrintStream ps = new PrintStream("test.txt");//使用字节输出流的方法ps.write(97);// ...

  10. lambda表达式——写多线程

    JDK1.8 中Lambda 表达式的出现,基本可以取替原来的匿名类实现多线程的方式.下面列举常用的常用的三种情况. 一.普通开启异步线程 new Thread(() -> System.out ...

最新文章

  1. 022 Spark shuffle过程
  2. [转]设置 UILabel 和 UITextField 的 Padding 或 Insets
  3. jmeter 核心_初识性能测试工具JMeter
  4. 【转载】十年学会编程
  5. TomcatServlet笔记
  6. Java 整数型的进制间的互相转换
  7. Windows phone 7应用之代码性能分析工具——Profile.
  8. 斑能不能彻底去掉_鸡脖、猪脖子上有淋巴结,会有大量毒素、病菌?还能不能放心吃?...
  9. linux java7 64位_linux jdk1.7 64位tar.gz下载安装配置教程(完美版)
  10. python-贪心算法
  11. 1.maya基本操作
  12. 【帝国CMS】灵动标签SQL调用广告系统里的广告
  13. 虚拟机服务器安装虚拟机的步骤
  14. i9 10900k和i7 9700k的区别大吗
  15. 【论文分享】ACL 2020 神经网络的可解释性
  16. 计算机一级怎么截图保存到桌面,怎么截屏电脑桌面
  17. python实现打卡
  18. 中国IT研发实力最强的城市分析(转载)
  19. 嵌入式系统开发设计---嵌入式系统开发设计
  20. java文件快速扫描仪_java扫描仪上传文件

热门文章

  1. Visual Studio2019配置备忘
  2. Java实现数学概率C ( a , b )
  3. AI英雄 | 论人工智能与自由意志,请看尤瓦尔与李飞飞的这场“激辩”
  4. 开新林哲自曝:打造二手车全球经营
  5. lpush rpush 区别_php-redis中文参考手册_list容器相关_lPush_rPush_lPushx_rPu...
  6. Element-UI下拉框select实现拼音搜索
  7. 互联网日报 | 农夫山泉正式登陆港交所;飞猪推出旅游业首个百亿补贴;苹果秋季发布会正式官宣...
  8. msg1500说明书_瑞斯康达MSG1500 路由 刷机 保姆级教程
  9. 【Scratch案例实操】scratch西游记师徒谁人气高 scratch编程案例教学 scratch创意编程 少儿编程教案
  10. RE文件管理器如何获取小程序APKG文件