diff --git a/rt-thread-version/rt-thread-standard/programming-manual/atomic/atomic.md b/rt-thread-version/rt-thread-standard/programming-manual/atomic/atomic.md index 792c44655eec5e017b163a41a4c109645af99787..143a52ff5bda9883266c19f9e1bf925466c9176b 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/atomic/atomic.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/atomic/atomic.md @@ -2,12 +2,12 @@ ## 原子操作简介 -原子操作(Atomic operation)是指一种不可分割的操作,要么完全执行成功,要么完全不执行。原子操作的执行过程中不允许有任何中断,如果出现了中断,那么操作的结果就无法保证。原子操作通常用于多线程编程中,保证多个线程之间的并发执行不会出现数据竞争等问题。在实现原子操作时,通常使用硬件指令或者操作系统提供的原子操作函数来保证操作的原子性。 在应用层面,原子操作可以用于实现一些高级的同步和并发控制机制。例如,在多线程编程中,如果多个线程都需要访问同一个共享变量,为了避免数据竞争问题,可以使用原子操作来保证对该变量的操作是原子的。我们以 ARM 内核执行一个 i++操作为例: +原子操作(Atomic operation)是指一种不可分割的操作,要么完全执行成功,要么完全不执行。原子操作的执行过程中不允许有任何中断,如果出现了中断,那么操作的结果就无法保证。原子操作通常用于多线程编程中,保证多个线程之间的并发执行不会出现数据竞争等问题。在实现原子操作时,通常使用硬件指令或者操作系统提供的原子操作函数来保证操作的原子性。 在应用层面,原子操作可以用于实现一些高级的同步和并发控制机制。例如,在多线程编程中,如果多个线程都需要访问同一个共享变量,为了避免数据竞争问题,可以使用原子操作来保证对该变量的操作是原子的。我们以 AARCH64 内核执行一个 i++操作为例: ```c -movl i, %eax //内存访问,读取 i 变量到 cpu 的 eax 寄存器 -addl $1, %eax //修改寄存器的值 -movl %eax, i //将寄存器中的值写回内存 +ldr w0, [i] //内存访问,读取 i 变量到 cpu 的 eax 寄存器 +add w0, w0, #1 //修改寄存器的值 +str w0, [i] //将寄存器中的值写回内存 ``` 我们看到对于编码的工程师我们执行一个 i++的操作仅需一行代码,在编译后 i++就会被翻译成三条指令,所以在这三条指令之间是可能会被系统调度、中断等事件打断的,因而我们在一些场景就需要一气呵成执行完上述操作,原子操作就具备这样的能力。