linux内核 work_queue 完成量,linux信号量与完成量

信号量:

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

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

状态。

#include

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

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内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】

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

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

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

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

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

Linux驱动 - 多线程之 完成量

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

Linux设备驱动程序 之 完成量

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

linux 3.10中完成量的使用

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

Linux信号量详解

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

Java中处理Linux信号量

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

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

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

随机推荐

AES加密算法实现

AES算法是一种对称加密算法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准. 下文实例中,密钥采用了直接写死的方式,实际使用中可以配合RSA加密算法加密密钥,从而达到更好的安全效 ...

【Unity Shaders】学习笔记——SurfaceShader(六)混合纹理

[Unity Shaders]学习笔记——SurfaceShader(六)混合纹理 转载请注明出处:http://www.cnblogs.com/-867259206/p/5619810.html 写 ...

SSH开发实践part2:双向1-N连接配置

1 OK,上一篇已经介绍了项目开发的前期准备工作,具体内容可以参考:http://www.cnblogs.com/souvenir/p/3783686.html 按照开发步骤,我们现在已经可以开始进行 ...

Ensures there will be no 'console is undefined' errors

很早之前项目中遇到过这种bug, 当时没有多留意,只是暂时把笔记留了下来,今天整理笔记的时候,看到了,故先整理在此,具体用法下次遇到再好好理解理解.如果有筒子遇到过,麻烦留言说一下,先谢谢啦. //E ...

【转】使用 udev 高效、动态地管理 Linux 设备文件

简介: 本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本 ...

动手写个数字输入框1:input[type=number]的遗憾

前言  最近在用Polymer封装纯数字的输入框,开发过程中发现不少坑,也有很多值得研究的地方.本系列打算分4篇来叙述这段可歌可泣的踩坑经历:

ContextLoaderListener加载过程

在web.xml中,配置ContextLoaderListener

layer开启与关闭加载层

// 开启加载层 layer.load(2, { shade: [0.6, '#fff'], content: '数据加载中...', success: function (layero) { lay ...

【转】使用Chrome Frame,彻底解决浏览器兼容问题

本文转自http://www.ryanbay.com/?p=269,感谢该作者的总结 X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的. 通过在meta中设置 ...

ZOOKEEPER解惑[转]

今年年初的时候,写了一篇ZooKeeper的入门文章,一直到这一周,才有时间将ZooKeeper整个源码通读了一遍.不能说完全理解了ZooKeeper的工作原理与 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值