青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天下

記錄修行的印記

Linux內核的同步機制(2)信號量(semaphore)

Linux內核的同步機制(2)信號量(semaphore)

  信號量在創建時需要設置一個初始值,表示同時可以有幾個任務可以訪問該信號量保護的共享資源,初始值為1就變成互斥鎖(Mutex),即同時只能有一個任務可以訪問信號量保護的共享資源。

  一個任務要想訪問共享資源,首先必須得到信號量,獲取信號量的操作將把信號量的值減1,若當前信號量的值為負數,表明無法獲得信號量,該任務必須掛起在該信號量的等待隊列等待該信號量可用;若當前信號量的值為非負數,表示可以獲得信號量,因而可以立刻訪問被該信號量保護的共享資源。

  當任務訪問完被信號量保護的共享資源后,必須釋放信號量,釋放信號量通過把信號量的值加1實現,如果信號量的值為非正數,表明有任務等待當前信號量,因此它也喚醒所有等待該信號量的任務。

信號量的API有:
DECLARE_MUTEX(name)
該宏聲明一個信號量name并初始化它的值為1,即聲明一個互斥鎖。

//在Linux2.6.26中沒找到該宏
DECLARE_MUTEX_LOCKED(name)
該宏聲明一個互斥鎖name,但把它的初始值設置為0,即鎖在創建時就處在已鎖狀態。因此對于這種鎖,一般是先釋放后獲得。

void sema_init (struct semaphore *sem, int val);
該函用于數初始化設置信號量的初值,它設置信號量sem的值為val。

void init_MUTEX (struct semaphore *sem);
該函數用于初始化一個互斥鎖,即它把信號量sem的值設置為1。

void init_MUTEX_LOCKED (struct semaphore *sem);
該函數也用于初始化一個互斥鎖,但它把信號量sem的值設置為0,即一開始就處在已鎖狀態。

void down(struct semaphore * sem);
該函數用于獲得信號量sem,它會導致睡眠,因此不能在中斷上下文(包括IRQ上下文和softirq上下文)使用該函數。該函數將把sem的值減1,如果信號量sem的值非負,就直接返回,否則調用者將被掛起,直到別的任務釋放該信號量才能繼續運行。

int down_interruptible(struct semaphore * sem);
該函數功能與down類似,不同之處為,down不會被信號(signal)打斷,但down_interruptible能被信號打斷,因此該函數有返回值來區分是正常返回還是被信號中斷,如果返回0,表示獲得信號量正常返回,如果被信號打斷,返回-EINTR。

int down_trylock(struct semaphore * sem);
該函數試著獲得信號量sem,如果能夠立刻獲得,它就獲得該信號量并返回0,否則,表示不能獲得信號量sem,返回值為非0值。因此,它不會導致調用者睡眠,可以在中斷上下文使用。

void up(struct semaphore * sem);
該函數釋放信號量sem,即把sem的值加1,如果sem的值為非正數,表明有任務等待該信號量,因此喚醒這些等待者。 

頭文件:
#include <linux/semaphore.h>
/*
 * Copyright (c) 2008 Intel Corporation
 * Author: Matthew Wilcox <willy@linux.intel.com>
 *
 * Distributed under the terms of the GNU GPL, version 2
 *
 * Please see kernel/semaphore.c for documentation of these functions
 
*/
#ifndef __LINUX_SEMAPHORE_H
#define __LINUX_SEMAPHORE_H

#include <linux/list.h>
#include <linux/spinlock.h>

/* Please don't access any members of this structure directly */
struct semaphore {
    spinlock_t        lock;
    unsigned int        count;
    struct list_head    wait_list;
};

#define __SEMAPHORE_INITIALIZER(name, n)                \
{                                    \
    .lock        = __SPIN_LOCK_UNLOCKED((name).lock),        \
    .count        = n,                        \
    .wait_list    = LIST_HEAD_INIT((name).wait_list),        \
}

#define __DECLARE_SEMAPHORE_GENERIC(name, count) \
    struct semaphore name = __SEMAPHORE_INITIALIZER(name, count)

#define DECLARE_MUTEX(name)    __DECLARE_SEMAPHORE_GENERIC(name, 1)

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);
}

#define init_MUTEX(sem)        sema_init(sem, 1)
#define init_MUTEX_LOCKED(sem)    sema_init(sem, 0)

extern void down(struct semaphore *sem);
extern int __must_check down_interruptible(struct semaphore *sem);
extern int __must_check down_killable(struct semaphore *sem);
extern int __must_check down_trylock(struct semaphore *sem);
extern int __must_check down_timeout(struct semaphore *sem, long jiffies);
extern void up(struct semaphore *sem);

#endif /* __LINUX_SEMAPHORE_H */

posted on 2013-04-12 18:22 天下 閱讀(2322) 評論(0)  編輯 收藏 引用 所屬分類: kernel & Driver

<2013年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久www成人_看片免费不卡| 免费不卡中文字幕视频| 欧美一区二区三区免费看| 欧美一区二区视频网站| 欧美午夜精品理论片a级大开眼界| 国产日韩欧美制服另类| 久久国产视频网站| 亚洲精品国产精品乱码不99按摩 | 欧美成人免费va影院高清| 欧美成人免费网| 欧美va天堂在线| 亚洲美女在线视频| 久久青草欧美一区二区三区| 精品1区2区| 狠狠色狠狠色综合日日小说| 欧美日在线观看| 欧美xart系列在线观看| 亚洲欧美中文在线视频| 日韩一本二本av| 亚洲乱码国产乱码精品精98午夜 | 亚洲性感美女99在线| 亚洲人体1000| 91久久精品一区二区别| 亚洲欧美国产精品va在线观看| 亚洲欧美日本伦理| 亚洲视频精选| 亚洲综合视频一区| 亚洲午夜av在线| 亚洲综合色在线| 久久久久国色av免费看影院| 午夜精品久久久久久久久| 欧美精品电影| 国产精品成人免费| 国产精品视频在线观看| 国产真实乱偷精品视频免| 1024精品一区二区三区| 亚洲欧洲视频在线| 在线视频免费在线观看一区二区| 亚洲午夜精品国产| 久久精品在线| 日韩午夜黄色| 久久久久久91香蕉国产| 欧美理论电影在线观看| 国产精品亚洲成人| 亚洲欧洲日本国产| 亚洲欧美在线视频观看| 亚洲第一毛片| 亚洲精品国久久99热| 欧美在线在线| 日韩小视频在线观看专区| 亚洲欧美偷拍卡通变态| 久热精品在线视频| 亚洲欧美综合精品久久成人| 欧美日韩精品免费看| 国产一区二区成人| 亚洲人久久久| 亚洲精品无人区| 久久久久久久尹人综合网亚洲| 亚洲伦伦在线| 欧美日韩另类字幕中文| 亚洲日本国产| 一区二区三区日韩在线观看| 欧美三级视频在线观看| 99国产精品久久久久久久成人热 | 欧美激情精品久久久久久免费印度| 欧美一区二区三区四区在线观看地址 | 99视频有精品| 伊人久久大香线蕉综合热线| 亚洲激情影视| 国产女人水真多18毛片18精品视频| 一区二区三区偷拍| 久久蜜桃精品| 国产精品乱码| 亚洲精品乱码久久久久久黑人 | 91久久久亚洲精品| 亚洲精品一二三| 亚洲一区成人| 欧美伦理一区二区| 欧美福利一区| 激情丁香综合| 久久精品色图| 久久天堂av综合合色| 欧美午夜精品理论片a级大开眼界| 女同性一区二区三区人了人一| 国产视频一区二区三区在线观看| 亚洲人精品午夜| 亚洲最快最全在线视频| 欧美高清在线一区二区| 久久最新视频| 亚洲欧美日韩国产中文在线| 亚洲视频一区二区在线观看| 欧美三级韩国三级日本三斤| 亚洲视屏一区| 久久精品首页| 亚洲欧洲在线免费| 国产精品av免费在线观看| 亚洲欧美日韩精品久久奇米色影视 | 激情久久久久久| 在线视频中文亚洲| 亚洲欧美在线视频观看| 国产一区二区久久| 久久久99爱| 亚洲精品日产精品乱码不卡| 一本一本久久a久久精品综合麻豆| 欧美日韩免费看| 久久精品欧洲| 亚洲一级免费视频| 欧美大片一区二区三区| 亚洲国产精品一区| 国产精品系列在线播放| 蜜臀久久99精品久久久画质超高清 | 亚洲天堂免费观看| 亚洲片在线观看| 老司机精品导航| 久久久九九九九| 久久精精品视频| 欧美一区激情| 99精品视频免费在线观看| 免费一级欧美片在线播放| 亚洲精选一区二区| 国产精品亚洲美女av网站| 欧美大片一区二区| 性做久久久久久久免费看| 亚洲国产片色| 亚洲精品在线一区二区| 尤物网精品视频| 亚洲日韩欧美视频一区| 亚洲精品欧美专区| 99国内精品久久久久久久软件| 亚洲国产欧美日韩精品| 久久亚洲精品网站| 韩日视频一区| 国产拍揄自揄精品视频麻豆| 国产欧美欧洲在线观看| 国产一区在线免费观看| 又紧又大又爽精品一区二区| 亚洲国产精品99久久久久久久久| 一区二区三区在线观看国产| 亚洲成色www8888| 亚洲一区二区三区免费观看 | 亚洲女优在线| 亚洲欧美国产va在线影院| 欧美在线视频一区| 欧美chengren| 国产一区二区在线观看免费播放 | 影音先锋成人资源站| 一区二区三区成人| 久久久在线视频| 亚洲欧美日韩在线综合| 欧美福利视频| 在线看片成人| 久久国产精品久久w女人spa| 一区二区三区欧美| 久久男女视频| 国户精品久久久久久久久久久不卡| 国产最新精品精品你懂的| 亚洲一卡二卡三卡四卡五卡| 欧美成人综合一区| 久久精视频免费在线久久完整在线看| 亚洲国产精品久久久久秋霞影院| 日韩亚洲欧美高清| 欧美日韩免费看| 亚洲国产欧美一区| 亚洲高清免费视频| 欧美另类高清视频在线| 亚洲剧情一区二区| 亚洲午夜高清视频| 国产精品高潮呻吟久久av黑人| 一本大道av伊人久久综合| 91久久综合| 国产日韩欧美视频| 免费久久精品视频| 欧美日韩国产综合网| 亚洲综合电影| 欧美中文在线字幕| 亚洲美女精品成人在线视频| 夜夜嗨一区二区| 黑人巨大精品欧美一区二区| 亚洲第一中文字幕在线观看| 欧美日韩在线一区二区三区| 久久精品视频导航| 欧美伦理影院| 免费观看成人鲁鲁鲁鲁鲁视频 | 快射av在线播放一区| 欧美成人精品激情在线观看| 亚洲欧美国产日韩中文字幕| 久久久亚洲午夜电影| 欧美影院成人| 欧美亚日韩国产aⅴ精品中极品| 亚洲风情在线资源站| 狼人社综合社区| 老司机一区二区三区| 亚洲在线观看视频网站| 欧美激情1区| 亚洲第一二三四五区| 在线观看91精品国产麻豆| 亚洲永久免费精品| 欧美一二三视频| 国产精品视频久久久| 亚洲制服欧美中文字幕中文字幕|