
Linux C/C++并发编程实战
文章平均质量分 81
Linux C/C++并发编程实战
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux C/C++并发编程实战(11)缓存颠簸
当一个处理器写入数据时,缓存一致性协议需要确保其他处理器的缓存中的数据也被更新或使其失效。例如,如果一个处理器在处理器 A 的缓存中更新了数据,那么协议会将这个更新传播到其他处理器的缓存。缓存一致性协议:为了保证在多个处理器缓存中数据的一致性,系统使用缓存一致性协议(如 MESI)。每当一个处理器写入数据时,协议必须将这个更新通知到所有其他处理器,以确保它们的缓存中的数据是一致的。每个处理器的缓存都可能有该数据的副本。当一个处理器对这个数据进行写入(如增加计数器的值)时,这个数据在处理器的缓存中被更新。原创 2024-08-15 18:19:01 · 318 阅读 · 0 评论 -
Linux C/C++并发编程实战(0)谈谈并发与并行
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。并行指在同一时刻,有多条指令在多个处理器上同时执行。原创 2023-05-14 21:25:07 · 806 阅读 · 0 评论 -
Linux C/C++并发编程实战(1)谈谈并发编程
使用并发编程可以将计算密集型的任务分解成多个子任务,并将这些子任务分配到不同的核心或处理器上并行执行,以提高程序的速度和吞吐量。为了避免这些问题,需要使用适当的同步机制,如锁、信号量、原子操作等,来协调不同线程之间的操作次序,保证共享资源的正确性和稳定性。在多线程编程中,如果某个操作涉及到共享数据,那么就需要保证这个操作的原子性,以避免多个线程同时修改同一个数据导致数据错误的问题。在并发编程中,程序由多个独立运行的线程或进程组成,这些线程或进程可以并行执行,从而实现任务的同时执行。原创 2023-03-22 11:50:50 · 410 阅读 · 0 评论 -
Linux C/C++并发编程实战(1)CPU缓存初探以及利用缓存特点优化代码
在计算机系统中,CPU高速缓存(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。缓存之所以有效,主要是因为程序运行时对内存的访问呈现局部性(Locality)特征。这种局部性既包括空原创 2022-06-13 00:58:53 · 934 阅读 · 0 评论 -
Linux C/C++并发编程实战(2)缓存一致性协议(MESI)
在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存 (MainMemory)。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也引入了新的问题:缓存一致性(CacheCoherence)。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致的情况,如果真的发生这种情况,那同步回到主内存时以谁的缓存数据为准呢?为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、 MESI(IllinoisPr原创 2022-06-12 23:10:49 · 1031 阅读 · 0 评论 -
Linux C/C++并发编程实战(3)cpu缓存伪共享问题
缓存系统中是以缓存行(cache line)为单位存储的,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。CPU1想要修改X,CPU2想要修改Y,这两个频繁改动的变量在同一个缓存行上,两个争夺缓存行的拥有权。CPU1抢到后,更新X,那么CPU2上的缓存行的状态就会变成I状态(无效)——状态含义(MESI协议)当CPU2抢到,更新Y,CPU1上缓存行就会变成I状态(无效)轮番抢夺,不仅会带来大量的RFO消息,而且某个线程读取此行数据时,L1和L2缓存上都是原创 2022-06-13 01:15:01 · 1026 阅读 · 0 评论 -
Linux C/C++并发编程实战(4)关于指令重排、乱序执行、数据依赖
指令流水线并不是串行的,并不会因为一个耗时很长的指令在“执行”阶段呆很长时间,而导致后续的指令都卡在“执行”之前的阶段上。这就是所谓的“顺序流入,乱序流出”。而编译器的乱序,作为编译优化的一种手段,则试图通过指令重排将这样的两条指令拉开距离, 以至于后一条指令进入CPU的时候,前一条指令结果已经得到了,那么也就不再需要阻塞等待了。前面提到,学习并发编程,需要学习相关特性,今天我们来了解下编译器和cpu的指令重排,由于指令重排的存在,并发编程需要提供对应的处理机制来应对这个问题,以保证程序执行的正确性。原创 2023-03-25 21:55:28 · 777 阅读 · 0 评论 -
Linux C/C++并发编程实战(5)内存屏障是什么?
全屏障(Full Barrier)是一种内存屏障,用于控制 CPU 的执行顺序,确保在执行全屏障之前的所有指令都已经执行完毕,避免指令重排等问题。同步屏障会阻塞当前 CPU 的指令流水线,并等待其他指令流水线中之前的指令执行完成,从而确保在同一时间点上,所有线程或处理器中对于共享内存的修改都已经执行完毕,并且禁止之前的指令进行重排,从而保证了程序的正确性。不合理的内存屏障会影响程序的性能,因此建议开发者在设计和优化程序时,要深入理解内存屏障的机制和作用,避免过度依赖内存屏障。原创 2023-03-26 17:24:24 · 1191 阅读 · 0 评论 -
Linux C/C++并发编程实战(6)C/C++ 6种内存时序memory_order
both end up with the same observable result), 这是乱序被允许出现所需要遵循的首要原则,也是为什么乱序虽然一直存在但却多数程序员大部分时间都感觉不到的根本原因。乱序的出现说到底是编译器,CPU 等为了让你程序跑得更快而作出无限努力的结果,程序员们应该为它们的良苦用心抹一把泪。从乱序的种类来看,乱序主要可以分为如下4种:..................原创 2022-08-12 01:43:28 · 853 阅读 · 0 评论 -
Linux C/C++并发编程实战(7)并发安全手段CAS机制
CAS,是Compare and Swap的简称。内存地址 V,旧的预期值 A新的值 B。执行 CAS 操作时,首先比较内存地址 V 中的值与预期值 A 是否相等,如果相等,则将新的值 B 更新到内存地址 V 中,否则不做任何操作。无论操作是否成功,都会返回当前内存地址 V 的值。读取内存地址 V 的当前值,保存为当前预期值 A。判断当前预期值 A 是否与内存地址 V 中的值相等。如果相等,将新的值 B 写入内存地址 V。返回当前内存地址 V 的值。原创 2023-12-10 16:27:59 · 1262 阅读 · 0 评论 -
Linux C/C++并发编程实战(8)CAS机制的ABA问题
然而,根据观察,在当前存在的CPU上,并且使用60位标签,只要程序的生命周期(即在不重新启动程序的情况下)限制在10年内,就不会发生环绕;因此,即使地址相同,下一次比较和交换操作也会失败,因为标签位不匹配。ABA问题:CAS在操作的时候会检查变量的值是否被更改过,如果没有则更新值,但是带来一个问题,最开始的值是A,接着变成B,最后又变成了A。此刻,Thread 1里看到的是top_ptr等于A, next_ptr 等于B,问题其实就在这里了,保证top_ptr等于A时,并不能保证next_ptr等于B。原创 2023-12-10 22:08:54 · 1444 阅读 · 0 评论 -
Linux C/C++并发编程实战(9)x86 上的原子操作实现--lock 指令前缀
当指令执行完毕,这个锁定动作也就会消失。在单处理器系统( UniProcessor,简称 UP)中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断只能发生在指令与指令之间。在多处理器系统( Symmetric Multi-Processor,简称 SMP)中情况有所不同,由于系统中有多个处理器在独立的运行,即使在能单条指令中完成的操作也可能受到干扰。(以及所有以 ‘X’ 开头的指令)都能够保证在多处理器系统下的原子操作,它们总会宣告一个 “LOCK#” 信号,而不管有没有 LOCK 前缀。原创 2024-09-22 21:58:31 · 483 阅读 · 0 评论