基础知识
并发:有共享资源、多处理器时要考虑并发
实现并发:
旗标 自旋锁 不加锁算法 原子变量 位操作 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)
|
阅读(1186) | 评论(0) | 转发(0) |