1.解决乱序的问题:通过barrier()编译屏蔽进行。
2.读写屏障:mb() ; rmb() ; wmb();以及作用于寄存器的__iormb(); __iowmb() ;读写寄存器readl_relaxed()和readl()的区别,主要在于有没有屏障。
---------------------------
中断屏蔽:--使用方式
local_irq_diable()
xxxxxx ---临界资源
local_irq_enable()
由于中断对于系统的很重要,所以临界区的资源耗时,必须少。
local_irq_save() :除了屏蔽中断以外,还保存系统的中断信息
xxxxx
local_irq_restore()
-----------------------------------------
整数的原子操作
设置原子变量值
void atomic_set(atomic_t *v, int i) :设置原子变量值为i
atomic_t v = ATOMIC_INIT(0) :初始化原子变量值为0
获取原子变量值
atomic_read(atomic_t* v)
原子变量的增减
void atomic_add(int i, atomic_t *v)
void atomic_sub(int i, atomic_t *v)
操作并测试
int atomic_inc_and_test(atomic_t *v)
int atomic_dec_and_test(atomic_t *v)
int atomic_sub_and_test(int i, atomic_t *v)
主要测试是否为0,为0,返回TURE
其他类似的就不在赘述。
自旋锁使用方法:
spinlock_t lock;
spin_lock_init(&lock)
spin_lock(&lock)
xxxxxxx
spin_unlock(&lock)
虽然自旋锁能够保证临界区不受本cpu和其他cpu的进程抢占影响,但是并不能够保证中断的影响。
有一些变体,这里就不在赘述。
自旋锁期间,不能调用引起调度的东西。