信号量:

   是用于保护临界区的一种常用方法,它的使用和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行

临界区的代码。但是与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等待

状态。

#include <linux/semaphore.h>





struct semaphore {

raw_spinlock_t          lock;

unsigned int            count;

struct list_head        wait_list;

};





定义一个信号量:

struct semaphore sem;





初始化信号量:

void sema_init(struct semaphore *sem, int val);  //val为count的初始值

//初始化为1

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

        //初始化信号量,并将信号量sem的值设置为0,就是在创建时就处于已锁定的状态

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





定义并初始化:

DECLARE_MUTEX(sem);  //count的初始值为1









锁定信号量:

void down(struct semaphore *sem);//获得信号量,可能导致睡眠,不能再中断上下文中使用该函数





int down_interruptible(struct semaphore *sem);

返回非0值表示被信号(不是被UP)唤醒, if(down_interruptible(&sem) return -ERESTARTSYS;



int down_trylock(struct semaphore *sem);//尝试获取信号量sem

返回非0表示没有获取锁





if(count的值大于0)

将count减1后立即返回

else

进入睡眠, down_trylock不会进入睡眠





释放信号量:

void up(struct semaphore *sem);//释放信号量sem,实质上是把sem的值加1





count的值加1





if(有进程等待该信号量)

唤醒第一个等待该信号量的进程



完成量:

#include <linux/completion.h>





struct completion {

unsigned int done;

wait_queue_head_t wait;

}





定义:

struct completion com;





初始化:

init_completion(&com);

done的初始值为0





定义并初始化:

DECLARE_COMPLETION(com);

done的初始值为0





等待完成量:

void wait_for_completion(struct completion *com);

int wait_for_completion_interruptible(struct completion *com);

返回-ERESTARTSYS表示被信号唤醒, 0 completion





if(done的值不等于0)

将done减1后立即返回

else

进入睡眠





唤醒完成量:

void complete(struct completion *com);

将done的值加1, 然后唤醒第一个等待该完成量的进程



void complete_all(struct completion *com);

将done的值设为最大, 然后唤醒所有等待该完成量的进程

linux信号量与完成量的更多相关文章

  1. linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】

    转自:http://blog.csdn.net/goodluckwhh/article/details/9006065 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一信 ...

  2. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  3. 大话Linux内核中锁机制之完成量、互斥量

    大话Linux内核中锁机制之完成量.互斥量 在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内 ...

  4. Linux驱动 - 多线程之 完成量

    Linux 系统提供了一种比信号量更好的同步机制,即完成量(completion ,它用于一个执行单元等待另一个执行单元执行完某事. Linux 系统中与 completion 相关的操作主要有以下 ...

  5. Linux设备驱动程序 之 完成量

    内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束:这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作等: 内核提供 ...

  6. linux 3.10中完成量的使用

    完成量是基于等待队列设计的,所以显然不能在中断上下文使用完成量. struct completion { unsigned int done; wait_queue_head_t wait; }; 我 ...

  7. Linux信号量详解

    1.什么是信号量信号量是一种特殊的变量,访问具有原子性.只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待:当信号量值大于0时,信号量减1,程序继续运行.2)发送信号量将信号量值加1. ...

  8. Java中处理Linux信号量

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5976361. ...

  9. linux上安装完torch后仍报错:ImportError: No module named torch

    linux上安装完torch后仍报错: Traceback (most recent call last): File , in <module> import torch ImportE ...

随机推荐

  1. 【Netty源码学习】BootStrap

    BootStrap是客户端的启动类,其主要功能就是设置必要的参数然后启动客户端. 实现如下: Bootstrap b = new Bootstrap(); b.group(group) .channe ...

  2. Erlang 集群互连测试

    Erlang 集群互连测试Erlang节点相同cookie全互联成为一个集群(cluster).如果2个集群不同cookie, 然后其中有节点连接到对方集群的节点,这2个集群会合并成一个集群吗?连接到 ...

  3. FFmpeg源代码简单分析:结构体成员管理系统-AVClass

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  4. Android中PropertyAnimation属性动画详解(一)

    在之前的文章中已经讲了帧动画frame-by-frame animation和补间动画tweened animation,其实这两种动画原理好简单,都是按照预先固定的动画模式来播放的,帧动画将一张张单 ...

  5. Cocos2D iOS之旅:如何写一个敲地鼠游戏(九):创建动画

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  6. 03安卓TextView

    一  TextView    父类 : View     >概念:文本控件 :文本内容的显示   默认配置不可编辑  子类EditText可以编辑 *********************** ...

  7. (九十四)集成PKRevealController实现左右抽屉视图

    使用PKRevealController可以实现类似于QQ等软件的左右抽屉视图,拖出的视图分为leftView和rightView,分别取自View的左半部分和右半部分,因此,根据不同的需求,可以选择 ...

  8. 1057. Stack (30) - 树状数组

    题目如下: Stack is one of the most fundamental data structures, which is based on the principle of Last ...

  9. 【原创】Eclipse vs. IDEA快捷键对比大全

    花了一天时间熟悉IDEA的各种操作,将各种快捷键都试了一下,感觉很是不错!于是就整理了一下我经常用的一些Eclipse快捷键与IDEA的对比,方便像我一样使用Eclipse多年但想尝试些改变的同学们. ...

  10. Ajax分页 Spring MVC + Hibernate

    效果图: 1.  添加公共类.方法.代码 1.    分页类:Page.java package cn.com.aperfect.sso.base.dao; import java.util.Arra ...