内核同步机制——完成量
内核中的许多部分初始化某些活动为单独的执行线程,然后等待这些线程完成。完成接口是一种有效并简单的方式来实现这样的代码模式。
对象创建:
DECLARE_COMPLETION(my_completion);
或
struct completion my_completion;/* ... */
init_completion(&my_completion);
操作:
void wait_for_completion(struct completion *c); //执行一个不可中断的等待
void complete(struct completion *c);//唤醒一个线程
void complete_all(struct completion *c);//唤醒多个线程i
当调用complete时,可重用completion对象,当调用complete_all时,需要重新初始化后才能重用complete对象,可使用宏INIT_COMPLETION(struct completion c);
/***********************************************************************/ //完成接口 //内核中的许多部分初始化某些活动为单独的执行线程,然后等待这些线程完成。 //完成接口是一种有效并简单的方式来实现这样的代码模式。 /***********************************************************************/ #include<linux/completion.h> #include<linux/module.h> #include<linux/sched.h> #include<linux/init.h> staticDECLARE_COMPLETION(my_thread_exit); /* Completion */ staticDECLARE_WAIT_QUEUE_HEAD(my_thread_wait); /* Wait Queue */ intpink_slip = 0; /* Exit Flag */ /*Helper thread */ staticint my_thread(void*unused) { DECLARE_WAITQUEUE(wait,current); daemonize("my_thread"); add_wait_queue(&my_thread_wait,&wait); while(1) { /*Relinquish processor until event occurs */ set_current_state(TASK_INTERRUPTIBLE); schedule(); /*Control gets here when the thread is woken upfrom the my_thread_wait wait queue */ /*Quit if let go */ if(pink_slip) { break; } /*Do the real work */ /*... */ } /*Bail out of the wait queue */ __set_current_state(TASK_RUNNING); remove_wait_queue(&my_thread_wait,&wait); /*Atomically signal completion and exit */ complete_and_exit(&my_thread_exit,0); } /*Module Initialization */ staticint __init my_init(void) { /*... */ /*Kick start the thread */ kernel_thread(my_thread,NULL, CLONE_FS| CLONE_FILES | CLONE_SIGHAND | SIGCHLD); /*... */ return0; } /*Module Release */ staticvoid __exit my_release(void) { /*... */ pink_slip= 1; /* my_thread must go */ wake_up(&my_thread_wait); /* Activate my_thread */ wait_for_completion(&my_thread_exit);/* Wait until my_thread quits */ /*... */ } module_init(my_init); module_exit(my_release); |
转载于:https://my.oschina.net/fuyajun1983cn/blog/263946
内核同步机制——完成量相关推荐
- Linux内核同步机制之(四):spin lock【转】
转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...
- linux中同步例子(完成量completion)
这是一个公交司机和售票员之间的线程调度,用于理解完成量,完成量是对信号量的一种补充,主要用于多处理器系统上发生的一种微妙竞争 在这里两个线程间同步,只有当售票员把门关了后,司机才能开动车,只有当司机停 ...
- 内核同步机制-RCU同步机制
转自http://www.360doc.com/content/09/0805/00/36491_4675691.shtml 目录 [隐藏] 1 RCU同步机制 1.1 RCU介绍 1.2 RCU A ...
- 内核同步机制之Mutex Exclusion
为什么80%的码农都做不了架构师?>>> S3C2440在内核版本2.6.34下开发ADC驱动时,会发现驱动程序里用了互斥通信来实现同步: <!-- lang: cpp ...
- Linux内核同步机制之信号量与锁
Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制--信号量.锁. 一.信号量 首先还是看看内核中是怎么 ...
- 内核同步机制-优化屏障和内存屏障
优化屏障 编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行.然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器 ...
- 内核同步机制-信号量(semaphore)
三.内核信号量(semaphore) Linux的信号量是一种睡眠锁,这个不同于自旋锁.如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列(具体可以参考进程的活动状态),然后 ...
- 内核同步机制——自旋锁
由于关键代码区可以跨越了多个函数或数据结构,需要有更通用的同步方法:锁. 内核中最常见的一种锁就是自旋锁.相同的锁可用于多处. 自旋锁可用在不可睡眠的场景,如中断处理函数.自旋锁是一种互斥设备,只有两 ...
- Linux内核同步机制之completion
内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作,等等.在这种 ...
最新文章
- java内存池实现_Netty精粹之轻量级内存池技术实现原理与应用
- ++i 和 i++的实现
- java进行md5运算(Java类函数调用)
- 从身体扮演到身份确认:谈谈EMI的人体自拍作品
- Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解
- Linux负载均衡软件LVS之一(概念篇)
- 多线程十 Timer
- 【转】卡巴斯基2011导入key专用工具+卡巴斯基提取key工具(激活码转换key)
- sqlserver 2008完整安装教程
- 网上一些《算法(第四版)》习题答案链接
- 很遗憾,该服务器不支持 jmail 组件!,Jmail组件安装方法及Windows 7系统下Jmail组件注册失败解决方法...
- 都说程序员秃头996,你见过游戏3D建模师爆肝007吗?
- 诺奖得主:2030年中国帕金森疾病患者将超过美国
- 怎么理解“不经审视的人生,不值得过!“
- 利用Android手机破解微信加密数据库EnMicroMsg.db文件
- 利用Python实现NBA球员分析绘制数据可视化图表
- php会员到期怎么判断,织梦用php判断检测会员是否登录并返回会员相关信息
- 网狐荣耀系列之微星棋牌在运营过程中用户登录不上
- wxPython官方文档翻译第一期初稿
- 编写一个简单的汇编程序(DOSBox 0.74和MASM 6.15)