SFENCE,LFENCE,MFENCE

当系统在做Memory IO操作的时候,用Index和Data间接方式访问寄存器(比如APIC 寄存器),这个时候需要加入写延时,否则,数据就会错位,因为系统硬件做流水操作,导致程序不能严格的顺序执行。而以前的延时值都是自己在实际中进行测试,选择一个比较合适的值,比较笨的方法!后来同事发现了mfence这个指令,可以正好使用在这个地方。mfence保证系统在后面的memory访问之前,先前的memory访问都已经结束。这是mfence是X86cpu家族中的新指令。

SFENCE,LFENCE,MFENCE指令提供了高效的方式来保证读写内存的排序,这种操作发生在产生弱排序数据的程序和读取这个数据的程序之间。 
   SFENCE——串行化发生在SFENCE指令之前的写操作但是不影响读操作。 
   LFENCE——串行化发生在SFENCE指令之前的读操作但是不影响写操作。 
   MFENCE——串行化发生在MFENCE指令之前的读写操作。 
sfence:在sfence指令前的写操作当必须在sfence指令后的写操作前完成。 
lfence:在lfence指令前的读操作当必须在lfence指令后的读操作前完成。 
mfence:在mfence指令前的读写操作当必须在mfence指令后的读写操作前完成。 

注意:SFENCE,LFENCE,MFENCE指令提供了比CPUID指令更灵活有效的控制内存排序的方式。

mfence is a memory barrier supported by hardware, and it only makes sense for shared memory systems. 

For example, you have the following codes 
<codes1> 
mfence 
<codes2> 

mfence or other memory barriers techniques disallows the code motion (load/store)from codes2 to codes1 done by _hardware_ . Some machines like P4 can move loads in codes 2 before stores in codes1, which is out-of-order. 

Another memory barrier is something like ("":::"memory"), which disallows the code motion done by _compiler_. But IMO memory access order is not always guaranteed in this case.


就是保证内存访问的串行化,内部操作就是在一系列内存访问中添加若干延迟,保证此指令之后的内存访问发生在此指令之前的内存访问完成之后(不出现重叠)。
lfence 读串行化
sfence 写串行化
mfence 读写都串行化

### C++ 中原子变量的用法与实现细节 在多线程环境中,为了确保多个线程能够安全地访问共享资源而不引发竞态条件(race condition),C++ 提供了 `std::atomic` 类型。这种类型的对象支持无锁操作,能够在不依赖外部同步机制的情况下执行基本的操作。 #### 定义与声明 通过头文件 `<atomic>` 可以引入标准库中的原子类模板 `std::atomic<T>`,其中 T 是任何内置类型或者满足特定约束的用户自定义类型。例如: ```cpp #include <atomic> std::atomic<int> counter(0); // 初始化为零的一个整数类型的原子变量 ``` 上述代码片段展示了如何创建并初始化一个名为 `counter` 的原子变量[^3]。 #### 主要功能方法 以下是几个常用的成员函数及其作用: - **load**: 返回当前存储值的一份副本。 - **store**: 设置新的数值到该位置。 - **exchange**: 将目标设置成指定的新值,并返回旧有的值。 - **compare_exchange_weak/strong**: 如果当前位置等于预期值,则将其替换;否则更新预期值再重试。 下面是一个简单的例子来演示这些操作的应用场景: ```cpp bool expected = false; if (flag.compare_exchange_strong(expected, true)) { perform_action(); } // 这里如果 flag 原本就是 true 则不会调用 perform_action() ``` 此段程序利用 compare-and-swap 技术实现了某种形式的互斥控制逻辑[^4]。 #### 实现原理概述 底层通常依靠硬件指令集的支持完成高效的内存屏障(memory barrier)以及读改写周期(read-modify-write cycle),从而保障跨 CPU 缓存一致性问题得到妥善处理。具体来说,在 x86 架构下可能对应 LFENCE/SFENCE/MFENCE 指令序列加上 lock prefix 加强版本号递增之类的动作[^5]。 值得注意的是,默认情况下所有的修改都是顺序一致模型(Ordering Model),即 Sequentially Consistent(SC), 开发者也可以选择更宽松些的选择比如 Relaxed Orderings 来优化性能瓶颈部分。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值