linux同步机制-complete
linux驱动程序中可以使用的同步机制有很多,这里只介绍complete机制。
1. 什么是complete?
completion,它用于一个执行单元等待另一个执行单元执行完某事。Linux系统中与completion相关的操作主要有以下4种:
(1) 定义completion
struct completion my_completion;
(2) 初始化completion
init_completion(&my_completion);
对my_completion的定义和初始化可以通过如下快捷方式实现
DECLEARE_COMPLETION(my_completion);
(3) 等待completion
void wait_for_completion(struct completion *c);
(4) 唤醒completion
void complete(struct completion *c);
void complete_all(struct completion *c);
前者只唤醒一个等待的执行单元,后者唤醒所有等待同一completion的执行单元。
2. complete的原理
- 初始化complete时对done变量和队列进行初始化。
static inline void init_completion(struct completion *x)
{x->done = 0;init_swait_head(&x->wait);
}
- 在complete函数中会累计产生complete的次数,并基于此次数对后续进行唤醒操作。
void complete(struct completion *x)
{unsigned long flags;raw_spin_lock_irqsave(&x->wait.lock, flags);x->done++; //累计complete执行了多少次__swait_wake_locked(&x->wait, TASK_NORMAL, 1);raw_spin_unlock_irqrestore(&x->wait.lock, flags);
}
EXPORT_SYMBOL(complete);
- 在唤醒操作时,每唤醒一次,就将done减1,直到done为0时,线程就会一直处于等到阻塞状态。
do_wait_for_common(struct completion *x,long (*action)(long), long timeout, int state)
{if (!x->done) {DEFINE_SWAITER(wait);swait_prepare_locked(&x->wait, &wait);do {if (signal_pending_state(state, current)) {timeout = -ERESTARTSYS;break;}__set_current_state(state);raw_spin_unlock_irq(&x->wait.lock);timeout = action(timeout);raw_spin_lock_irq(&x->wait.lock);} while (!x->done && timeout);swait_finish_locked(&x->wait, &wait);if (!x->done)return timeout;}x->done--; //每唤醒一次等待的线程,就自减一次return timeout ?: 1;
}
3. complete的使用
struct completion temp_completion; //定义一个变量
init_completion(&temp_completion); //初始化变量complete(&temp_completion); //发送完成量 唤醒一个等待
wait_for_completion(&temp_completion); //等待完成量complete_all(&temp_completion); //唤醒所有等待
wait_for_completion_timeout(&temp_completion, HZ); //等待可以超时
wait_for_completion_interruptible(&temp_completion); //等待可以被中断
wait_for_completion_interruptible_timeout(&temp_completion); //等待可以超时、被中断
linux同步机制-complete相关推荐
- Linux 内核 up down,linux同步机制之信号量down 和up
信号量(semaphore) Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,因此他和System V的IPC机制信号量毫不相干 ...
- Linux内核同步机制之(四):spin lock【转】
转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...
- linux 线程管理、同步机制等
线程 学了那么多有关进程的东西,一个作业从一个进程开始,如果你需要执行其他的东西你可以添加一些进程,进程之间可以通信.同步.异步.似乎所有的事情都可以做了. 对的,进程是当初面向执行任务而开发出来的, ...
- Linux kernel 同步机制(下篇)
之前的文章 Linux kernel同步机制 在上一部分,我们讨论了最基本常见的几类同步机制,这一部分我们将讨论相对复杂的几种同步机制,尤其是读写信号量和RCU,在操作系统内核中有相当广泛的应用. 读 ...
- Linux kernel同步机制
在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实像多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问,尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上 ...
- 哪些是Linux内核的同步机制,Linux内核的同步机制(1)
Linux内核的同步机制(1) yanqin | 2009-04-16 14:51:09 阅读:791 发布文章 一. 引言 %A %A 在现代操作系统里,同一时间可能有多个内核执行流在执行,因 ...
- Linux中的同步机制
1.背景 编写内核代码或驱动代码时需要留意共享资源的保护,防止共享资源被并发访问.所谓并发访问,就是指多个内核路径同时访问和操作相同地址的数据,有可能发生相互覆盖共享数据的情况,造成被访问数据的不一致 ...
- Linux阻塞和同步机制
Linux阻塞和同步机制 阻塞和非阻塞 阻塞和非阻塞是设备访问的两种基本方式.使用这两种方式,驱动程序可以灵活地支持阻塞与非阻塞的访问. 阻塞调用是指调用结果返回之前,当前线程被挂起.函数只有在得到结 ...
- Linux 内核的同步机制,第 1 部分(来自IBM)
一. 引言 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问.尤其是在多处理器系统上,更需要一些同步机制来同步 ...
最新文章
- RADIUS协议:认证与计费的鼻祖
- 微型计算机重点,微型计算机理期末重点.doc
- ActiveMQ消息传递的两种方式
- 杂项相关工具的使用方法(边刷题边更新...)
- Ukiyo-e faces dataset 浮世绘面孔数据集
- Springboot+MyBatis-plus+postgresSQL 的整合
- 【LeetCode笔记】剑指Offer 43. 1~n 整数中1出现的次数(Java、数位dp、偏数学)
- (08)System Verilog 队列详解
- 办公室小野与爆米花视频身亡女孩家属和解:补偿金额保密
- 静态文件用什么服务器配置,静态文件服务器路径怎么配置好
- 蓝桥杯 BASIC-19 基础练习 完美的代价
- 乱七八糟的,mark的东西...
- android ios base64编码,IOS Base64编码/解码
- 年轻导演的创业之路-杨立坤
- python写几个好玩的程序_Python写的Msn机器人,几好玩的
- JavaScript中事件的绑定与解绑
- lsdyna如何设置set中的node_list_如何画出一幅好看的图
- RTOS的基本概念与线程基础知识
- 构建静态页面 之 [ 浮动 ]
- 埃森哲荣膺“IDC商业分析服务提供商”领军者