![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++并发编程实战
文章平均质量分 94
江南梦才
这个作者很懒,什么都没留下…
展开
-
C++并发编程实战——06.设计基于锁的并发数据结构
或者当多个线程执行不同的操作时,对同一数据结构的并发操作是安全的,而多线程执行同样的操作时,可能会出现问题。本质上互斥量使线程只能**串行化(serialzation)**访问数据,为了实现更高效并发的设计思路:减少保护区域,减少序列化操作,提升并发访问的能力,但修改必须是单线程的,这种结构类似于。这会限制栈的实现方式,线程等待时会浪费宝贵的资源去检查数据,或要求用户编写等待和提示的代码,这使内部锁失去存在的意义,也造成资源的浪费。STL类的迭代器需要持有容器内部引用,意思就是要有锁,脱离原容器的控制。原创 2023-11-02 23:46:28 · 211 阅读 · 0 评论 -
C++并发编程实战——05.内存模型与原子操作
一个保存操作A(标记为memory_ order_release, memory_order_acq_rel或memory_order_seq_cst)前序依赖一个读取操作B(标记为memory_order_consume),前提是操作B使用了保存的值。保存操作使用memory_order_release,读取操作使用memory_order_consume,这确保了其原子操作加载指向某些数据的指针,所指向的数据是正确同步的,而不对任何其他非依赖的数据施加任何同步要求(常用于指针)。原子变量this值!原创 2023-11-02 23:45:02 · 260 阅读 · 0 评论 -
C++并发编程实战——04.同步操作
因为锁存器是一个同步对象,所以线程调用cound_down改变计数器的行为是可见的,从而保证对wait的调用和返回在同一个锁存器 上为可见。当线程都抵达栅栏时,会对线程进行阻塞,直到所有线程都达到栅栏处,这时阻塞将会被解除。:在系统中有很多独立的(运行在一个独立的线程上)参与者,这些参与者会互相发送信息,去执行手头上的任务,并且不会共享状态,除非是通过信息直接传入的。方法一:当一个线程等待另一个线程完成时,可以持续的检查共享数据标志(用于做保护工作的互斥量),直到另一线程完成工作时对这个标识进行重置。原创 2023-11-02 23:39:38 · 291 阅读 · 0 评论 -
C++并发编程实战——03.共享数据
使用多个互斥量保护所有的数据,细粒度锁也有问题。互斥量保护一个独立类的实例,锁的状态的下一个阶段,不是离开锁定区域将锁定区域还给用户,就是有独立的互斥量去保护这个类的全部实例,都不好。当多个互斥量在是在同一级上时,不能同时持有多个锁,所以“手递手”的方案需要每个互 斥量在一条链上,并且每个互斥量都比前一个有更低的层级值,这在某些情况下无法实现。这里需要另一种不同的互斥量,这种互斥量常被称为“读者-作者锁”,因为其允许两种不同的使用方式:一个“作者”线程独占访问和共享访问,让多个“读者”线程并发访问。原创 2023-11-02 23:35:15 · 111 阅读 · 0 评论 -
C++并发编程实战——02.线程管理
每个程序至少有一个执行main()函数的线程,创建std::thread对象就是启动线程,之后需要等待这个线程结束。分离线程只能确定线程什么时候结束,发后即忘(fire and forget)的任务使用到就是分离线程。类似,不同是的添加了析构函数。当你需要对等待中的线程有更灵活的控制时(线程等待或查看是否结束)需要使用其他机制来完成,比如条件变量和。当原对象是临时变量时,则自动进行移动操作,但当原对象是一个命名变量,转移的时候就需要使用。如果不相等,那么就代表了两个不同线程,或者一个有线程,另一没有线程。原创 2023-11-02 23:33:47 · 82 阅读 · 0 评论 -
C++并发编程实战——01.并发与并行
从1998标准中完全缺乏支持,经历了各种平台相关的扩展,再到C++11/C++14/C++17标准和并发技术规范对多线程的支持。芯片制造商选择了以多核芯的形式,使得更多任务可以同时执行的方式来增加处 理能力,而不是增加单个核心的执行速度。在这个趋势下,C++多线程来的正是时候,它使得开发者们可以利用CPU带来的更加强大的硬件并发。原创 2023-11-02 23:32:02 · 137 阅读 · 0 评论