1. 信号量
信号量是为了解决共享资源问题而生的,通过著名的P/V操作可以获取和释放信号量,只有获得信号量的线程才可以访问共享资源,从而防止竞态的发生。
其中P操作有三种情况:
void down(struct semaphore *sem); // 如果信号量可以获得,信号量减一; 如果信号量不可以获得则阻塞进程并不可中断
int down_interruptible(struct semaphore *sem); // 如果信号量可以获得,信号量减一,函数返回零; 如果信号量不可以获得则阻塞进程但可以被中断,如果进程被中断,函数返回非零值
int down_trylock(struct semaphore *sem); // 如果信号量可以获得,函数返回零; 如果信号不可以获得,函数返回非零值
V操作只有一种情况:
void up(struct semaphore *sem); // 任何拿到信号量的线程都必须通过调用一次且仅有一次up函数来释放信号量
2. 读取者/写入者信号量
当共享资源可以被且仅被一个写入者访问,或者当共享资源可以被一个或多个读写者访问时,可以考虑使用这种特殊的信号量。
3. completion
当需要解决共享资源的同步访问问题时,可以考虑使用completion。
4. 自旋锁
"一个自旋锁是一个互斥设备,它只能有两个值:“锁定”和“解锁”"(LDD3 p119)
在不能阻塞代码中可以考虑使用自旋锁解决资源共享的问题。
5. 读取者/写入者自旋锁
类似于读取者/写入者信号量