---
title: CPU内存屏障指令移植
description: "在x86-64架构中，内存屏障指令主要分为sfence、lfence和mfence三类。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0047.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0047.html
indexId: 26f48b030fe98fecd81cda6bb1312a5cc975607f9d050fc3d1ac7dea601857a965
---
# CPU内存屏障指令移植

在x86-64架构中，内存屏障指令主要分为sfence、lfence和mfence三类。

- sfence指令前后的写入(store/release)指令，按照在sfence前后的指令序执行。从硬件上来说，保证store buffer数据全部被清空的时候才继续往后面执行。
- lfence指令前后的读取(load/acquire)指令，按照在lfence前后的指令序执行。
- mfence指令之前的写入(store/release)指令，都在该mfence指令之后的写入（store/release）指令之前（指令序，Program Order）执行。既确保写者能够按照指令序完成数据写入，也确保读者能够按照指令序完成数据读取。

例如，在x86上的代码段：

```
__asm__ __volatile__("sfence" : : : "memory");
__asm__ __volatile__("lfence" : : : "memory");
__asm__ __volatile__("mfence" : : : "memory");
```


在鲲鹏上分别替换为：

```
__asm__ __volatile__("dmb ishst" : : : "memory");
__asm__ __volatile__("dmb ishld" : : : "memory");
__asm__ __volatile__("dmb ish" : : : "memory");
```
