Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158365
  • 博文数量: 40
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 355
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 18:05
文章分类
文章存档

2011年(1)

2010年(9)

2009年(16)

2008年(14)

我的朋友

分类: LINUX

2008-12-05 15:54:30

基础知识
并发:有共享资源、多处理器时要考虑并发
实现并发:
旗标  自旋锁 不加锁算法 原子变量 位操作 seqlock锁 读取-拷贝-更新
概念
    不可中断:不能休眠,不被中断影响,用于中断代码等
    临界区:在任何给定时间只有一个线程可以执行的代码,但
            这个线程可以休眠,用于并发
 
旗标和互斥体
asm/semaphore.h
步骤:
   

1.初始化
struct semaphore
void sema_init(struct semaphore *sem, int val);
//正常形式旗标

DECLARE_MUTEX(name);
DECLARE_MUTEX_LOCKED(name);
//互斥锁的模式的旗标,前一个初始化为1,后一个为0(上锁状态)
void init_MUTEX(struct semaphore *sem);
void init_MUTEX_LOCKED(struct semaphore *sem);
//互斥锁的模式在运行时间初始化(必须先定义了一个旗标)

2.P操作
void down(struct semaphore *sem);
int down_interruptible(struct semaphore *sem);
int down_trylock(struct semaphore *sem);
//down不可中断

//down_trylock调用时会立即返回,不会休眠
3.V操作
void up(struct semaphore *sem);

示例源码

文件: pv.rar
大小: 0KB
下载: 下载

读者/写者旗标

linux/rwsem.h
struct rw_semaphore;
void init_rwsem(struct rw_semaphore *sem);

void down_read(struct rw_semaphore *sem);
int down_read_trylock(struct rw_semaphore *sem);
void up_read(struct rw_semaphore *sem);


void down_write(struct rw_semaphore *sem);
int down_write_trylock(struct rw_semaphore *sem);
void up_write(struct rw_semaphore *sem);
void downgrade_write(struct rw_semaphore *sem);

Completions 机制

 含义:允许一个线程告诉另一个线程工作已经完成

linux/completion.h

DECLARE_COMPLETION(my_completion);
//一步搞定
struct completion my_completion;
init_completion(&my_completion);
//先定义,后初始化

void wait_for_completion(struct completion *c);
//等待 completion,不可中断的

void complete(struct completion *c);
void complete_all(struct completion *c);
//只有一个等待者时,两者相同,若多个等待者在等待,则complete只唤醒一个,另一个全部唤醒

INIT_COMPLETION(struct completion c);
//若使用完 complete_all,又想重新使用struct completion,则要调用此函数重新初始化。
void complete_and_exit(struct completion *c, long retval);

//唤醒而后退出(像while(1){}这样的代码中调用了wait_for_completion)

 

阅读(1148) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~