硬件原子操作
并发的根源
- 多线程、多进程调度
- 各种中断
并发对程序的不良影响
- 篡改共享数据
- 动作不完整
- 同步、死锁、数据竞争、系统调度开销…
硬件同步原语
由计算机硬件提供的一组原子操作,具有不可分割性,避免并行运算执行错误。
案例
//C语言代码
进程一:i=10
进程二:i=20
//汇编代码
进程一:
ldr r0, =0X30000000 /* i 变量的内存地址 */
ldr r1, = 10 /* 要写入的值 */
str r1, [r0] /* 将 10 写入到 i 变量中 */
进程二:
ldr r0, =0X30000000 /* i 变量的内存地址 */
ldr r1, = 20 /* 要写入的值 */
str r1, [r0] /* 将 10 写入到 i 变量中 */
原子整型操作接口
原子整型变量
typedef struct {
int counter;
} atomic_t;
ATOMIC_INIT()
定义整型原子变量并设置初始值
atomic_t data = ATOMIC_INIT(int i)
atomic_set()
用于设置整型原子变量的值
atomic_set(atomic_t *v,int i)
atomic_read()
获取原子变量的值
atomic_read(atomic_t *v)
atomic_add()/atomic_sub()
整型原子变量的加/减
static inline void atomic_add(int i, atomic_t *v) //整型原子变量加i
static inline void atomic_sub(int i, atomic_t *v) //整型原子变量减i
atomic_inc()/atomic_dec()
整型原子变量自增/自减
static inline void atomic_inc(atomic_t *v) //整型原子变量自增1
static inline void atomic_dec(atomic_t *v)//整型原子变量自减1
位原子操作函数
set_bit()
将某一位置1
set_bit(int nr, unsigned long *addr)
clear_bit()
将某一位置0
clear_bit(int nr, unsigned long *addr)
change_bit()
反转某一位的值
int test_bit(int nr, unsigned long \*addr)