1. 当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”。如果传递了一个临时变量,而不是一个命名的变量;C++编译器会将其解析为函数声明,而不是类型对象的定义。

例如:

class background_task
{
public:
void operator()() const
{
do_something();
do_something_else();
}
};
background_task f;
std::thread my_thread(f);//正确

std::thread my_thread(background_task());//???my_thread变成了一个函数

???这里相当与声明了一个名为my_thread的函数,这个函数带有一个参数(函数指针指向没有参
数并返回background_task对象的函数),返回一个 std::thread 对象的函数,而非启动了一个
线程。

使用在前面命名函数对象的方式,或使用多组括号①,或使用新统一的初始化语法②,可以避
免这个问题。
如下所示:

std::thread my_thread((background_task())); // 1
std::thread my_thread{background_task()}; // 2

使用lambda表达式也能避免这个问题。

std::thread my_thread([]{
do_something();
do_something_else();
});

2. 精心组织代码来保护共享数据

切勿将受保护数据的指针或引用传递到互斥锁作用域之外,无论
是函数返回值,还是存储在外部可见内存,亦或是以参数的形式传递到用户提供的函数中
去。

转载于:https://www.cnblogs.com/zhanghu52030/p/9322958.html

C++并发编程实战---阅读笔记相关推荐

  1. Java并发编程艺术阅读笔记(一)

    Java并发编程艺术阅读笔记(一) 1.什么是上下文切换 CPU通过时间片分配算法循环执行任务,执行完一个任务的时间片后就会切换到下一个任务.但是在切换任务之前会保存上一个任务的状态,在切换回该任务, ...

  2. Java并发编程实战读书笔记

    Java并发编程 标签(空格分隔): 并发 多线程 基础 线程 在执行过程中,能够执行程序代码的一个执行单元,在Java语言中,线程有四种状态:运行,就绪,挂起,结束. 并发特性 原子性 一个操作不会 ...

  3. java并发编程实战阅读总结(b)

    5.Executor框架 Executor框架是并发集合java.util.concurrent中的一个成员. Executor为灵活且强大的异步任务执行框架提供了基础,还提供了对生命周期的支持,以及 ...

  4. java并发编程实战阅读总结(a)

    1.锁(lock)与volatile (1).隐式锁,java提供了强制原子性的内置锁机制:synchronized块或synchronized方法. 操作共享状态的复合操作必须是原子的,以避免竞态条 ...

  5. 《java并发编程实战》笔记(第3章)

    (十二)volatile变量 volatile变量 ,用来确保将变量的更新操作通知到其他线程.当把变量申明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.因此不会将该变量上的操作与 ...

  6. 第十一章 性能与可伸缩性 Java并发编程实战 阅读总结

    线程的最主要目的是提高程序的运行性能. 线程可以使程序更加充分地发挥系统的可用处理能力, 从而提高系统的资源利用率. 此外, 线程还可以使程序在运行现有任务的情况下立即开始处理新的任务, 从而提高系统 ...

  7. Java并发编程实战读书笔记三

    第七章 取消和关闭 Java没有提供任何机制来安全的终止线程,虽然 Thread.stop 和 suspend 等方法提供了这样的机制,但由于存在着一些严重的陷,因此应该避免使用 7.1任务取消 7. ...

  8. Java并发编程实战读书笔记(一)——线程安全性、对象共享

    一.线程安全性 一个对象是否需要是线程安全的,取决于它是否被多个线程访问. 当多个线程访问,并且其中有一个执行写入时,必须采用同步机制,Java中主要的同步关键字是 synchronized 独占加锁 ...

  9. Java并发编程实战读书笔记二

    第五章 基础构建模块 5.1 同步容器类 5.1.1 同步容器类的问题 如下,如果list含有10个元素,线程A调用getLast的同时线程B调用deleteLast,那么getLast可能会报Arr ...

最新文章

  1. RedHat、CentOS设置静态IP、主机名、关闭防火墙(虚拟机VMware客户机)
  2. python网络爬虫系列(五)——数据提取 jsonpath模块
  3. 让用户研究插上数据的翅膀
  4. js 快速集成开发:easyui 时间控件格式化
  5. 全球首例无人车撞人致死事故判决:Uber无罪,安全员要进一步调查
  6. python安装-Python安装
  7. 视图控制器的View创建方式
  8. ubuntu16.04 kinect2 驱动和ROS驱动
  9. 中国传媒大学公开课:理解人类传播
  10. linux进程sleep硬盘,linux下线程调用sleep,进程挂起
  11. 【三维目标检测】PointRCNN(二)
  12. 微信小程序阻止事件冒泡【看这里】
  13. 把汇总报表页面生成 pdf文件方案!
  14. dataframe动态命名(读取不同文件并规律命名)
  15. 基于 VIVADO 的 AM 调制解调(1)方案设计
  16. python精选04集(选择语句)
  17. JQuery制作手风琴效果
  18. 个人搭建阿里云轻量级服务器
  19. golang的内存回收策略
  20. Bison for Windows

热门文章

  1. Linux 命令之 gunzip -- 用来解压缩文件
  2. java控制图片移动_多线程控制图片移动
  3. 服务器windows模拟linux环境,科学网—Windows不用虚拟机或双系统,轻松实现shell环境:gitforwindows - 刘永鑫的博文...
  4. cpu占用100_Java项目服务器cpu占用100%解决办法
  5. zdal配置文件_Autofac的基本使用---4、使用Config配置
  6. html ios视频播放器,良心推荐!iOS端的视频播放应用
  7. python测试开发实战_《python测试开发实战》基于pytest基础部分实例1-Hello
  8. 【流媒体FLV封装协议】
  9. qchart折现图_Qt开发技术:QCharts(二)QCharts折线图介绍、Demo以及代码详解
  10. html a标签去掉下划线_如何用HTML基本元素制作表格