硬件原子操作

本文探讨了并发的根源,如多线程、多进程调度和中断,以及它对程序可能产生的负面影响,如数据竞争和同步问题。硬件同步原语通过提供原子操作来解决这些问题,确保在多线程环境中的正确性。文章还介绍了C语言中的原子整型操作接口,如atomic_set、atomic_inc等,以及位原子操作函数set_bit和clear_bit,这些工具在并发编程中起到关键作用。
摘要由CSDN通过智能技术生成

并发的根源

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

并发对程序的不良影响

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

硬件同步原语

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

案例

//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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值