atomic操作在kernel 源代码中是比较常见的,主要是防止读取的是寄存器的内容,而内存的值已经被其他线程改变,主要是因为多线程的原因。对于 PM 来说,主要是操作atomic struct 里的变量counter。

atomic_read

define atomic_read(v) READ_ONCE((v)->counter)

atomic_set

define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))

详细代码如下:

linux 学习笔记之atomic

atomic_add_unless

atomic_add_unless函数的实现在arch/arm/include/asm/atomic.h中。
atomic_add_unless 这个feature是将新值存入atomic_t类型的变量,并把变量的旧值返回,函数实现如下:

linux 学习笔记之atomic
__atomic_add_unless函数path:nclude/asm-generic/atomic.h,函数实现如下:
linux 学习笔记之atomic
函数会事先判断a 值是否与传入atomic_t中的counter值相同,如果相同就返回旧的counter值;如果不同的话, 则会call 到atomic_cmpxchg, atomic_cmpxchg 位于
arch/sparc/lib/atomic32.c, 函数实现如下:
linux 学习笔记之atomic
该函数用于判断,旧值counter是否和old 相同,如果相同,就会把旧counter 值和 a 的相加之后的值赋值给counter,并且返回旧counter值;如果不相同,就直接返回旧counter值。基本上两次循环就会实现counter值被更新。

相关文章:

  • 2022-01-30
  • 2022-12-23
  • 2021-08-13
  • 2021-05-21
  • 2021-10-15
猜你喜欢
  • 2021-12-12
  • 2021-09-18
  • 2021-08-08
  • 2022-02-08
  • 2021-11-12
  • 2021-07-17
  • 2022-01-13
相关资源
相似解决方案