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); void atomic_dec(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);
|
2.使用自旋锁
2.1.自旋锁类型
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.信号量类型
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.互斥锁类型
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.共享资源如果只是简单的整形变量时使用原子变量