为了防止不同的cpu抢占同一段代码(即同一段内存地址),需要用自旋锁将这段代码锁住。

自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将临界区开锁。自旋锁上锁后让等待线程进行忙等待而不是睡眠阻塞,而信号量是让等待线程睡眠阻塞。自旋锁的忙等待浪费了处理器的时间,但时间通常很短,在1毫秒以下。

自旋锁用于多个CPU系统中,在单处理器系统中,自旋锁不起锁的作用,只是禁止或启用内核抢占。在自旋锁忙等待期间,内核抢占机制还是有效的,等待自旋锁释放的线程可能被更高优先级的线程抢占CPU。 

自旋锁使用方法如下:

spinlock_t my_lock

void spin_lock_init(spinlock_t *lock);

void spin_lock(spinlock_t *lock);

//code here

void spin_unlock(spinlock_t *lock);

 

持有自旋锁的代码在任何情况下都不能放弃CPU,否则很可能引起系统死锁,因此若这段代码有可能切换应用,则不能使用自旋锁,而必须使用互斥锁。

互斥锁使用方法如下:

static struct mutex toggle_mutex;

mutex_init(&toggle_mutex);

mutex_lock(&toggle_mutex);

//code here

mutex_unlock(&toggle_mutex);

另外,结构体变量在声明时被分配内存空间,这点与int、long等变量不同。

你可能感兴趣的:(锁)