linux下用于并发、竞态管理的机制有:spinlock_t,semaphore,mutex,completion,atomic_t等, 下面依次分析其实现原理
1. spinlock_t:其实就是一个volatile unsigned int。在lock的时候关闭bh,调用lock锁住内存总线禁止其他cpu访问内存,然后将变量从内存读出减一后再写入。spin_unlock只是锁住内存总线的情况下简单的将变量置1。
2.semaphore的内核结构为:
struct semaphore {
spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};
3. mutex 本质为count预置为1的semaphore。
4. completion:
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;
wait_for_completion在spinlock_t的保护下等待done不为0; complete则增加done的值。
5. atomic_t (atomic_64_t)也是在spinlock_t保护下的long(或longlong)。(其值为变量的地址。)
6. 为什么持有spinlock 不能睡眠?
spinlock的时候是disable_preempt关闭抢占的,如果睡眠(即主动放弃CPU)则另一进程调用spin_lock的时候会持续尝试获取锁,但肯定不成功的,导致死锁。