132 十面埋伏的并发(一):硬件同步原语

1 并发的根源

  • 多线程、多进程调度
  • 各种中断

2 并发对程序的不良影响

  • 篡改共享数据
  • 动作不完整
  • 同步、死锁、数据竞争、系统调度开销…

3 硬件同步原语

由计算机硬件提供的一组原子操作,具有不可分割性,避免并行运算执行错误。

4 案例

c中看起来的一步操作,在实际执行时可能被分成多步。

//C语言代码
进程一:i=10
进程二:i=20

//汇编代码(注意这里是arm汇编,其它架构的汇编可能不同)
进程一:
ldr r0, =0X30000000 /* i 变量的内存地址 */
ldr r1, = 10 /* 要写入的值 */
str r1, [r0] /* 将 10 写入到 i 变量中 */

进程二:
ldr r0, =0X30000000 /* i 变量的内存地址 */
ldr r1, = 20 /* 要写入的值 */
str r1, [r0] /* 将 10 写入到 i 变量中 */

5 原子整型操作接口

(1) 原子整型变量

typedef struct
{
	int counter;
} atomic_t;

(2) ATOMIC_INIT()


定义整型原子变量,并设置初始值
用法如下

// 定义一个原子整型变量,并初始化赋值
atomic_t data = ATOMIC_INIT(int i);

(3) atomic_set()

用于设置整型原子变量的值
用法如下

atomic_set(atomic_t *v, int i);

(4) atomic_read()

获取原子变量的值
用法如下

// 返回int型
atomic_read(atomic_t *v)

(5) atomic_add()/atomic_sub()

整型原子变量的加/减

// 整型原子变量加 i
static inline void atomic_add(int i, atomic_t *v) 
// 整型原子变量减 i
static inline void atomic_sub(int i, atomic_t *v) 

(6) atomic_inc() / atomic_dec()

整型原子变量自增/自减

//整型原子变量自增 1
static inline void atomic_inc(atomic_t *v)
//整型原子变量自减 1
static inline void atomic_dec(atomic_t *v)

(7) 位原子操作函数

11 set_bit()

将某一位置1

// 要操作数的第几位
// 要操作的数的地址
set_bit(int nr, unsigned long *addr)
22 clear_bit()

将某一位置0

clear_bit(int nr, unsigned long *addr)
33 change_bit()

反转某一位的值

int test_bit(int nr, unsigned long \*addr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值