1.设置原子变量的值void atomic_set(atomic_t *v, int i); /* 设置原子变量的值为 i */atomic_t v = ATOMIC_INIT(0); /* 定义原子变量 v 并初始化为 0 */2.获取原子变量的值atomic_read(atomic_t *v); /* 返回原子变量的值*/3.原子变量加/减void atomic_add(int i, atomic_t *v); /* 原子变量增加 i */void atomic_sub(int i, atomic_t *v); /* 原子变量减少 i */4.原子变量自增/自减void atomic_inc(atomic_t *v); /* 原子变量增加 1 */void atomic_dec(atomic_t *v); /* 原子变量减少 1 */5.操作并测试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);(3).自旋锁
1.定义自旋锁spinlock_t lock;2.初始化自旋锁spin_lock_init(lock)该宏用于动态初始化自旋锁 lock。3.获得自旋锁spin_lock(lock)该宏用于获得自旋锁 lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放。spin_trylock(lock)该宏尝试获得自旋锁 lock,如果能立即获得锁,它获得锁并返回真,否则立即返回假,实际上不再“在原地打转”。4.释放自旋锁spin_unlock(lock)该宏释放自旋锁 lock,它与 spin_trylock 或 spin_lock 配对使用。(4).自旋锁之读写锁
1.定义和初始化读写自旋锁rwlock_t my_rwlock = RW_LOCK_UNLOCKED; /* 静态初始化 */rwlock_t my_rwlock;rwlock_init(&my_rwlock); /* 动态初始化 */2.读锁定void read_lock(rwlock_t *lock);void read_lock_irqsave(rwlock_t *lock, unsigned long flags);void read_lock_irq(rwlock_t *lock);void read_lock_bh(rwlock_t *lock);3.读解锁void read_unlock(rwlock_t *lock);void read_unlock_irqrestore(rwlock_t *lock, unsigned long flags);void read_unlock_irq(rwlock_t *lock);void read_unlock_bh(rwlock_t *lock);4.写锁定void write_lock(rwlock_t *lock);void write_lock_irqsave(rwlock_t *lock, unsigned long flags);void write_lock_irq(rwlock_t *lock);void write_lock_bh(rwlock_t *lock);int write_trylock(rwlock_t *lock);5.写解锁void write_unlock(rwlock_t *lock);void write_unlock_irqrestore(rwlock_t *lock, unsigned long flags);void write_unlock_irq(rwlock_t *lock);void write_unlock_bh(rwlock_t *lock);(5).读写锁之顺序锁
写执行单元涉及的顺序锁操作如下:1.获得顺序锁void write_seqlock(seqlock_t *sl);int write_tryseqlock(seqlock_t *sl);write_seqlock_irqsave(lock, flags)write_seqlock_irq(lock)write_seqlock_bh(lock)其中:write_seqlock_irqsave() = loal_irq_save() + write_seqlock()write_seqlock_irq() = local_irq_disable() + write_seqlock()write_seqlock_bh() = local_bh_disable() + write_seqlock()2.释放顺序锁void write_sequnlock(seqlock_t *sl);write_sequnlock_irqrestore(lock, flags)write_sequnlock_irq(lock)write_sequnlock_bh(lock)其中:write_sequnlock_irqrestore() = write_sequnlock() + local_irq_restore()write_sequnlock_irq() = write_sequnlock() + local_irq_enable()write_sequnlock_bh() = write_sequnlock() + local_bh_enable()读执行单元涉及的顺序锁操作如下:1.读开始unsigned read_seqbegin(const seqlock_t *sl);read_seqbegin_irqsave(lock, flags);2.重读int read_seqretry(const seqlock_t *sl, unsigned iv);read_seqretry_irqrestore(lock, iv, flags);(6).RCU(读-拷贝-更新)
1.读锁定rcu_read_lock()rcu_read_lock_bh()2.读解锁rcu_read_unlock()rcu_read_unlock_bh()3.同步 RCUsynchronize_rcu()(7).信号量
1.定义信号量下列代码定义名称为 sem 的信号量:struct semaphore sem;2.初始化信号量void sema_init(struct semaphore *sem, int val);3.获得信号量void down(struct semaphore * sem);该函数用于获得信号量 sem,它会导致睡眠,因此不能在中断上下文使用;4.释放信号量void up(struct semaphore * sem);该函数释放信号量 sem,唤醒等待者。(8).信号量之完成量
1.定义完成量下列代码定义名为 my_completion 的完成量:struct completion my_completion;2.初始化 completion下列代码初始化 my_completion 这个完成量:init_completion(&my_completion);对 my_completion 的定义和初始化可以通过如下快捷方式实现:DECLARE_COMPLETION(my_completion);3.等待完成量下列函数用于等待一个 completion 被唤醒:void wait_for_completion(struct completion *c);4.唤醒完成量下面两个函数用于唤醒完成量:void complete(struct completion *c);void complete_all(struct completion *c);
新闻热点
疑难解答