线程同步(1):原子操作,内存屏障,锁综述

本文介绍了CPU如何通过原子操作、内存屏障和锁来实现线程同步。在多核多线程环境中,由于处理器的乱序执行和编译器优化,可能导致异步问题。内存屏障用于确保指令执行顺序和数据一致性,而锁(如自旋锁、读写锁、互斥锁等)则是用户层的同步手段,它们利用CPU提供的硬件机制保证数据访问的原子性和一致性。通过对这些概念的理解,开发者能够更好地实现并发控制。
摘要由CSDN通过智能技术生成

原子操作,内存屏障,

 

1.原理:CPU提供了原子操作、关中断、锁内存总线,内存屏障等机制;OS基于这几个CPU硬件机制,就能够实现锁;再基于锁,就能够实现各种各样的同步机制(信号量、消息、Barrier等等等等)。

 

2.所有的同步操作最基础的理论就是原子操作。内存屏障,锁都是为了保证在不同的平台或者是CPU类型下的原子操作。

 

3.原子操作在单核,单线程/无中断,且编译器不优化的情况下是确定的,是按照C/C++代码顺序执行的,所以不存在异步问题

  解释一下这几个知识点为什么会引起异步操作:

    首先了解一下cpu处理指令的步骤:

           1.早起的处理器为有序处理器,指令处理顺序:

a.读取指令

  b.执行指令如果寄存器可写就从内存取出a的数据到寄存器,寄存器不可写就等待

          c.寄存器处理指令

          d.将寄存器结果存入内存

           2.现在的处理器大多数为乱序处理器,处理顺序:

            a.读取指令

b.指令被划分到指令队列

  c.指令在队列中等待,如果寄存器可写就从内存取出a的数据到寄存器,寄存器不可写就等待

          d.寄存器处理指令

          e.将执行结果存入队列(而不是立即写入寄存器堆)

f.只有当所有更早的请求执行的指令结果被写入内存之后,执行的结果才会被存入内存(执行结果重排序,让执行看起来是有序的)

 

        那么问题来了:1.一条简单的a++语句究竟会有这么多条指令,而这一组指令是可以在任意时候异步执行的(共享数据)

a.单核多线程情况下,线程是存在中断的,中断的时候cpu调用另一线程的同一指令组,所以是可能出现交叉执行的可能,也就是说单线程或者关掉中断可以解决异步问题,但很多时候这种做法并不实际          

                        b.多核多线程情况下共享数据被多个核并

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值