LDD读书笔记第五章-并发和竞态(二)

锁陷阱

不明确的规则:每个线程不能第二次尝试获得该锁。
锁的顺序规则:保证每个线程都以相同的顺序获得锁。
锁的粒度对比:粗粒度锁会导致竞争严重,细粒度锁会导致额外的开销和给维造成副作用

除了锁之外的方法

免锁算法

大量的读取者,只有一个写入者可以使用免锁算法。
免锁算法类似于循环队列(个人理解)。

原子变量

原子变量执行速度非常块。
只要有可能编译器会把对原子变量的操作编译成单条指令。
[阅读全文] »

LDD读书笔记第五章-并发和竞态(一)

linux信号量的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <asm /semaphore.h>  /*信号量相关头文件*/
struct semaphore		/*信号量相关结构体*/
/*初始化相关函数*/
void  sema_init(struct semaphore *sem,int val); 
/*初始化信号量函数*/
DECLARE_MUTEX(name);	/*创建互斥体并初始化为1*/
DECLARE_MUTEX_LOCKED(name);	/*创建互斥体并初始化为0*/
void init_MUTEX(struct semaphore *sem); /*初始化互斥体为1*/
void init_MUTEX_LOCKED(struct semaphore *sem); /*初始化互斥体为0*/
/*down&up 相关函数*/
void down(struct semaphore *sem); /*不可中断*/
int down_interruptible(struct semaphore *sem); /*可中断*/
int down_trylock(struct semaphore *sem); /*立即退出*/
void up(struct semaphore *sem); /*释放信号量*/
</asm>

down_trylock函数在获取信号量失败时立即退出而不会等待。成功返回0,失败返回非零值。

读取者/写入者信号量

读取者/写入者信号量允许有一个写入者和无穷多个读取者。
当只需要读取数据时使用读取者信号量,仅当需要写入数据时获得写入者信号量。
[阅读全文] »