[读书笔记]C++并发编程实战

[读书笔记]C++并发编程实战原文地址:https://github.com/xuyicpp/multi_threading C++并发编程的内容每一章都从浅入深讲解的很详细,虽然第一遍有一些还不是很懂,例如无锁编程和线程池,以后遇到这些问题可以回来翻翻笔记加深印象。multi_threading《C++并发编程实战》的读书笔记,供以后工作中查阅。第一章何谓并发和多线程...
摘要由CSDN通过智能技术生成

[读书笔记]C++并发编程实战

原文地址:https://github.com/xuyicpp/multi_threading
C++并发编程的内容每一章都从浅入深讲解的很详细,虽然第一遍有一些还不是很懂,例如无锁编程和线程池,以后遇到这些问题可以回来翻翻笔记加深印象。

multi_threading

《C++并发编程实战》的读书笔记,供以后工作中查阅。

第一章

  • 何谓并发和多线程

并发:单个系统里同时执行多个独立的活动。

多线程:每个线程相互独立运行,且每个线程可以运行不同的指令序列。但进程中所有线程都共享相同的地址空间,并且从所有的线程中访问到大部分数据。

  • 为什么要在应用程序中使用并发和多线程

关注点分离(DVD程序逻辑分离)和性能(加快程序运行速度)

  • 一个简单的C++多线程程序是怎么样的

清单1.1 一个简单的Hello,Cuncurrent World程序

第二章

  • 启动线程,以及让各种代码在新线程上运行的方法

多线程在分离detach的时候,离开局部函数后,会在后台持续运行,直到程序结束。如果仍然需要访问局部函数的变量(就会造成悬空引用的错误)。
清单2.1 当线程仍然访问局部变量时返回的函数
解决上述错误的一个常见的方式,使函数自包含,并且把数据复制到该线程中而不是共享数据。

std::thread是支持移动的,如同std::unique_ptr是可移动的,而非可复制的。以下是两个转移thread控制权的例子
清单2.5 从函数中返回std::thread,控制权从函数中转移出清单2.6 scoped_thread和示例用法,一旦所有权转移到该对象其他线程就不就可以动它了,保证退出一个作用域线程完成
- 等待线程完成并让它自动运行

在当前线程的执行到达f末尾时,局部对象会按照构造函数的逆序被销毁,因此,thread_guard对象g首先被销毁。所以使用thread_guard类可以保证std::thread对象被销毁前,在thread_guard析构函数中调用join。
清单2.3 使用RAII等待线程完成

  • 唯一地标识线程

线程标识符是std::thread::id类型的
1.通过与之相关联的std::thread对象中调用get_id()。
2.当前线程的标识符可以调用std::this_thread::get_id()获得。

第三章

  • 线程间共享数据的问题

所有线程间共享数据的问题,都是修改数据导致的(竞争条件)。如果所有的共享数据都是只读的,就没问题,因为一个线程所读取的数据不受另一个线程是否正在读取相同的数据而影响。

避免有问题的竞争条件
1.用保护机制封装你的数据结构,以确保只有实际执行修改的线程能够在不变量损坏的地方看到中间数据。
2.修改数据结构的设计及其不变量,从而令修改作为一系列不可分割的变更来完成,每个修改均保留其不变量。者通常被称为无锁编程,且难以尽善尽美。

  • 用互斥元保护数据
    清单3.1 用互斥元保护列表中,有一个全局变量,它被相应的std::mutex的全局实例保护。在add_to_list()以及list_contains()中对std::lock_guard的使用意味着这些函数中的访问是互斥的list_contains()将无法再add_to_list()进行修改的半途看到该表。

注意:一个迷路的指针或引用,所有的保护都将白费。在清单3.2 意外地传出对受保护数据的引用展示了这一个错误的做法。

发现接口中固有的竞争条件,这是一个粒度锁定的问题,就是说锁定从语句上升到接口了,书中用一个stack类做了一个扩展,详见清单3.5 一个线程安全栈的详细类定义

死锁:问题和解决方案:为了避免死锁,常见的建议是始终使用相同的顺序锁定者两个互斥元。
std::lock函数可以同时锁定两个或更多的互斥元,而没有死锁的风险。
常见的思路:
- 避免嵌套锁
- 在持有锁时,避免调用用户提供的代码
- 以固定顺序获取锁
这里有几个简单的事例:清单3.7 使用锁层次来避免死锁清单3.9 用std::unique_lock灵活锁定

锁定在恰当的粒度
特别的,在持有锁时,不要做任何耗时的活动,比如文件的I/O。
一般情况下,只应该以执行要求的操作所需的最小可能时间而去持有锁。这也意味着耗时的操作,比如获取获取另一个锁(

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值