linux字符设备并发访问控制

linux字符设备并发访问控制

1.使用原子变量

1.1.原子变量类型
1
2
3
typedef struct{
int counter;
}atomic_t;
1.2.常用的api
1
2
3
4
5
6
7
static inline void atomic_set(atomic_t *v,int i);	//设置原子变量的值

void atomic_inc(atomic_t *v); //设置原子变量自加1
void atomic_dec(atomic_t *v); //设置原子变量自减1
int atomic_inc_and_test(atomic_t *v); //设置原子变量自加1
int atomic_dec_and_test(atomic_t *v); //设置原子变量自减1
int atomic_sub_and_test(int i,atomic_t *v); //设置原子变量自减i

2.使用自旋锁

2.1.自旋锁类型
1
spinlock_t lock;
2.2.常用的api
1
2
3
4
5
6
//需包含头文件
#include <linux/spinlock.h>
spin_lock_init(spinlock_t *lock); //初始化自旋锁
spin_lock(spinlock_t *lock); //获得自旋锁(成功立即返回),否则直到获得该自旋锁的进程释放该自旋锁
spin_trylock(spinlock_t *lock); //成功获得自旋锁立即返回,否则返回假
spin_unlock(spinlock_t *lock); //释放自旋锁

3.使用信号量

3.1.信号量类型
1
sem_t sem
3.2.常用的api
1
2
3
4
5
#include <linux/semaphore.h>
void sema_init(struct semaphore *sem,int val); //初始化信号量
int down(struct semaphore *sem); //深度睡眠
int down_interruptible(struct semaphore *sem); //浅度睡眠
void up(struct semaphore *sem); //释放信号量

4.使用互斥锁

4.1.互斥锁类型
1
mutex_t mutex
4.2.常用的api
1
2
3
void mutex_init(&mymutext);
void mutex_lock(struct mutex *mutex);
void mutex_unlock(struct mutex *mutex);

5.并发访问控制的选择

1.不允许睡眠的上下文采用忙等待,不可以睡眠的上下文使和中断上下文使用忙等待类

2.允许睡眠的上下文,或者临界区代码执行时间过长的建议使用阻塞类

3.中断屏蔽仅在有与中断上下文共享资源时使用

4.共享资源如果只是简单的整形变量时使用原子变量


linux字符设备并发访问控制
https://dreamaccount.github.io/2022/06/24/linux字符设备并发访问控制/
作者
404NotFound
发布于
2022年6月24日
许可协议