内核中的许多部分初始化某些活动为单独的执行线程,然后等待这些线程完成。完成接口是一种有效并简单的方式来实现这样的代码模式。

对象创建:

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

内核同步机制——完成量相关推荐

  1. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  2. linux中同步例子(完成量completion)

    这是一个公交司机和售票员之间的线程调度,用于理解完成量,完成量是对信号量的一种补充,主要用于多处理器系统上发生的一种微妙竞争 在这里两个线程间同步,只有当售票员把门关了后,司机才能开动车,只有当司机停 ...

  3. 内核同步机制-RCU同步机制

    转自http://www.360doc.com/content/09/0805/00/36491_4675691.shtml 目录 [隐藏] 1 RCU同步机制 1.1 RCU介绍 1.2 RCU A ...

  4. 内核同步机制之Mutex Exclusion

    为什么80%的码农都做不了架构师?>>>    S3C2440在内核版本2.6.34下开发ADC驱动时,会发现驱动程序里用了互斥通信来实现同步: <!-- lang: cpp ...

  5. Linux内核同步机制之信号量与锁

    Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制--信号量.锁. 一.信号量 首先还是看看内核中是怎么 ...

  6. 内核同步机制-优化屏障和内存屏障

    优化屏障 编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行.然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器 ...

  7. 内核同步机制-信号量(semaphore)

    三.内核信号量(semaphore) Linux的信号量是一种睡眠锁,这个不同于自旋锁.如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列(具体可以参考进程的活动状态),然后 ...

  8. 内核同步机制——自旋锁

    由于关键代码区可以跨越了多个函数或数据结构,需要有更通用的同步方法:锁. 内核中最常见的一种锁就是自旋锁.相同的锁可用于多处. 自旋锁可用在不可睡眠的场景,如中断处理函数.自旋锁是一种互斥设备,只有两 ...

  9. Linux内核同步机制之completion

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

最新文章

  1. java内存池实现_Netty精粹之轻量级内存池技术实现原理与应用
  2. ++i 和 i++的实现
  3. java进行md5运算(Java类函数调用)
  4. 从身体扮演到身份确认:谈谈EMI的人体自拍作品
  5. Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解
  6. Linux负载均衡软件LVS之一(概念篇)
  7. 多线程十 Timer
  8. 【转】卡巴斯基2011导入key专用工具+卡巴斯基提取key工具(激活码转换key)
  9. sqlserver 2008完整安装教程
  10. 网上一些《算法(第四版)》习题答案链接
  11. 很遗憾,该服务器不支持 jmail 组件!,Jmail组件安装方法及Windows 7系统下Jmail组件注册失败解决方法...
  12. 都说程序员秃头996,你见过游戏3D建模师爆肝007吗?
  13. 诺奖得主:2030年中国帕金森疾病患者将超过美国
  14. 怎么理解“不经审视的人生,不值得过!“
  15. 利用Android手机破解微信加密数据库EnMicroMsg.db文件
  16. 利用Python实现NBA球员分析绘制数据可视化图表
  17. php会员到期怎么判断,织梦用php判断检测会员是否登录并返回会员相关信息
  18. 网狐荣耀系列之微星棋牌在运营过程中用户登录不上
  19. wxPython官方文档翻译第一期初稿
  20. 编写一个简单的汇编程序(DOSBox 0.74和MASM 6.15)

热门文章

  1. 最近想问题想的睡不着,上来郁闷下!
  2. 【转】推荐两款富文本编辑器:NicEdit和Kindeditor
  3. shell中变量的替换
  4. 通用Logging框架设计
  5. 神经网络入门——12梯度下降代码
  6. Netty4具体解释三:Netty架构设计
  7. 欢迎进入Node.js世界
  8. python 列表生成式
  9. 全部编程皆为Web编程
  10. 防水+四扬声器诺基亚X7细节