锁
锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价.
自旋锁
自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直到获取到锁而不会让出控制权.
自旋锁的特点也使其只能用于保护操作较短的临界区,且不能睡眠.
代码实现
主要是通过cas等原子操作来模拟.
typedef volatile spin_lock_t;
spin_lock(spin_lock_t *lock)
{
do {
if (cas(&lock, 0, 1) == 0) // cas循环判断,直到加锁成功.
break;
} while (1);
}
spin_unlock(spin_lock_t *lock)
{
atomic_set(&lock, 0); // 锁变量置0
}
互斥锁
用原子操作和信号量实现互斥锁
typedef struct {
int val;
int waiters;
spin_lock_t lock;
sem_t *sem;
}mutex_lock_t;
mutex_lock(mutex_lock_t *lock)
{
while(cas(&lock->val, 0, 1) != 0)
{
sem_wait(sem);
}
}