悟空學Linux專欄----第46篇

  (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。

  下一篇繼續講解信號量的操作函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章