(Linux內核同步機制之信號量)
從這篇開始就來講講Linux內核的同步機制吧!
首先我們來看看semaphore信號量吧;定義在
struct semaphore {
spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};
其中lock爲自選鎖,放在結構體裏面用於實現count字段的原子增減操作;無符號整數count爲線程競爭的信號量,wait_list字段爲等待此信號量的進程的鏈表;
初始化:
如何初始化一個信號量呢?作爲Linux內核基礎設施之一的同步機制,包括 了信號量、各種鎖、和進程等待的等待隊列以及Per-CPU變量等,內核都
提供了兩種初始化方法, 分別是靜態和動態初始化方式。
1)靜態初始化方式:
#define __SEMAPHORE_INITIALIZER(name, n) \
{ \
.lock = __SPIN_LOCK_UNLOCKED((name).lock), \
.count = n, \
.wait_list = LIST_HEAD_INIT((name).wait_list), \
}
#define DECLARE_MUTEX(name) \
struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
現在我們只需要一條語句:DECLARE_MUTEX(name)就可以完成聲明和初始化!
從上面代碼中可知道,count字段值被初始化了1;
2)動態初始化
#define init_MUTEX(sem) sema_init(sem, 1)
#define init_MUTEX_LOCKED(sem) sema_init(sem, 0)
static inline void sema_init(struct semaphore *sem, int val)
{
static struct lock_class_key __key;
*sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val);
lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0);
}
動態動態初始化提供了兩個宏定義,分別將count值初始化爲了1和0。
下一篇繼續講解信號量的操作函數。