Chinaunix首页 | 论坛 | 博客
  • 博客访问: 274264
  • 博文数量: 150
  • 博客积分: 2396
  • 博客等级: 大尉
  • 技术积分: 1536
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-19 09:55
文章分类

全部博文(150)

文章存档

2021年(1)

2015年(9)

2014年(7)

2013年(50)

2012年(33)

2011年(1)

2010年(13)

2009年(36)

我的朋友

分类: LINUX

2009-10-18 10:08:12

信号量是避免竞争的方法之一,信号量存在如下缺点:
(1) 当一个信号量有较多竞争者时,性能降低.
(2) 正常使用时,一个试图对信号量加锁代码发现信号量几乎任何时候都可用.
(3) 当前面的任务完成时,下个线程调用DOWN操作时很多时候都必须等待.
(4) 信号量有时候会在调用UP操作之前消失.
(5) 信号量的动态分配时,信号量的使用比较困难.
从LINUX2.47开始内核引进了completion机制. 接口函数包含在里面
声明一个completion变量.
DECLARE_COMPLETION(my_completion);
下面两个函数 动态创建和初始化completion 变量.
struct completion my_completion;
init_completion (&my_completion);
等待completion,等待一个任务的完成.该函数不可被中断.如果调用了wait_for_completion而又没有其它任何人来完成这个任务,后果是这个进程不能被杀掉.
void wait_for_completion(struct completion *c);
completion 只唤醒一个等待进程,completion_all可以唤醒所有的等待进程.但在多数情况下,就只有一个等待者,此时两个函数的功能也一样.
void completion (struct completion *c);
void completion_all(struct completion *c);
快速初始化,该函数用于再次初始化.
INIT_COMPLETION (struct completion c);
example
DECLARE_COMPLETION(comp);
ssize_t complete_read (struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
printk(KERN_DEBUG "process %i (%s) going sleep\n", current->pid,current->comm);
wait_for_completion(&comp);
printk(KERN_DEBUG "awoken %i (%s)\n",current->pid,current->comm);
return 0;
}
ssize_t complete_write (struct file *filp,char __user *buf ,size_t count ,loff_t *ops)
{
printk(KERN_DEBUG "process %i (%s) awakening the readers...\n',
current->pid, current->comm);
complete (&comp);
return count ;
}
complete机制常用于模块的退出时与线程的终止,在模块准备好被清理时exit告示线程退出并等待结束.
void complete_and_exit(struct completion *c,long retval);
阅读(2126) | 评论(0) | 转发(0) |
0

上一篇:linux软中断的小结

下一篇:简单的led驱动

给主人留下些什么吧!~~