国嵌内核驱动进阶班-6-4 竞争与互斥(2)

并发与竞态


 

处理并发的机制(信号量和自旋锁)


  • 信号量

1.定义信号量

#include <asm/semaphore.h>

struct semaphore sem;

2.初始化信号量

void sema_init(struct semaphore *sem, int val)

val 为非正数 表明有任务等待信号量

 

3.锁

int down_interruptible(struct semaphore *sem)

TASK_INTERUPTIBLE

down_killable(struct semaphore *sem)

TASK_KILLABLE

※ down()已经不建议使用

4. 释放

void up(struct semaphore *sem)

  • 互斥锁(特殊的信号量)

1. 初始化互斥锁

void init_MUTEX(struct semaphore *sem) //初始化为1

DECLARE_MUTEX(struct semaphore *sem)//定义并初始化为1

void init_MUTEX_LOCKED(struct semaphore *sem) //初始化为0

DECLARE_MUTEX_LOCKED(struct semaphore *sem)//定义并初始化为0

  • 自旋锁

不会引起调用的睡眠,特点为忙等。

spin_lock_init(x)

  spin_lock(lock)

  spin_trylock(lock)

  spin_unlock(lock)

  • 信号量与自旋锁区别

   1. 信号量可以有多个持有者,自旋锁只能有一个持有者。

   2. 自旋锁适用于持有时间较短的(忙等的特点)


原文地址:https://www.cnblogs.com/renhl/p/4547844.html