在linux中提供了一些机制用来避免竞争条件,最简单的一个种就是自旋锁,例如:当一个临界区的数据在多个函数之间被调用时,为了保护数据不被破坏,可以采用spinlock来保护临界区的数据,当然还有一个就是信号量也是可以实现临界区数据的保护的。以后在介绍信号量吧。这里还是先说说splinlock吧。
1:定义和初始化spinlock
在linux中定义spinlock的方法很简单,与普通的结构体定义方式是一样的。其代码如下:
spinlock_t spinlock = SPIN_LOCK_UNLOCKED;
一个自旋锁必须初始化才能被使用,可以通过在编译阶段通过宏定义来实现,比如上面的SPIN_LOCK_UNLOCKED,这个表示一个没有锁定的自旋锁。同时在运行阶段可以使用spin_lock_init()函数动态地初始化一个自旋锁,其函数原型如下:
spinlock_t spin_lock_init(spinlock_t lock);
2:锁定自旋锁
进入临界区之前,需要使用spin_lock宏定义来锁定自旋锁,spin_lock宏定义的代码如下:
#define spin_lock(lock) _spin_lock(lock)
这个宏用来获得lock的自旋锁,如果能够立即获得自旋锁,则宏立刻返回,否则,这个宏一直等待下去,直到被其它线程释放为止。
3:释放自旋锁
退出临界区之前,需要使用spin_unlock宏定义来释放自旋锁。spin_unloc