一、自旋锁
1、定义自旋锁:spinlock_t lock
2、初始化自旋锁:spin_lock_init(lock)
3、获得自旋锁:spin_lock(lock)
4、释放自旋锁:spin_unlock(lock)
5、自旋锁实例:
/* 定义一个自旋锁
spinlock_t lock;
spin_lock_init(&lock);
spin_lock (&lock) ; /* 获取自旋锁,保护临界区 */
. . ./* 临界区*/
spin_unlock (&lock) ; /* 解锁*/
6、读写自旋锁:
(1)允许读的并发,可以同时有多个读可执行单元;
(2)只能最多有一个写进程;
(3)读操作和写操作不能同时进行。
二、信号量
1、定义信号量:struct semaphore sem
2、初始化信号量:void sema_init(struct semaphore *sem, int val)
但是通常会使用以下两种方法初始化信号量:
(1)#define init_MUTEX(sem) sema_init(sem, 1) //该宏用于初始化一个用于互斥的信号量,
它把信号量 sem 的值设置为 1;
(2)#define init_MUTEX_LOCKED(sem) sema_init(sem, 0) //该宏也用于初始化一个信号量,但它把信
号量 sem 的值设置为 0;
3、获得信号量:void down(struct semaphore * sem)
4、释放信号量:void up(struct semaphore * sem)。
5、如果信号量被初始化为 0,则它可以用于同步,同步意味着一个执行单元的继续执行需等待另一执行单元完成某事,保证执行的先后顺序;
5、只有当进程占用资源时间较长时,用信号量才是较好的选择。