文章目录
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)