LDD读书笔记第五章-并发和竞态(二)
锁陷阱
不明确的规则:每个线程不能第二次尝试获得该锁。
锁的顺序规则:保证每个线程都以相同的顺序获得锁。
锁的粒度对比:粗粒度锁会导致竞争严重,细粒度锁会导致额外的开销和给维造成副作用
除了锁之外的方法
免锁算法
大量的读取者,只有一个写入者可以使用免锁算法。
免锁算法类似于循环队列(个人理解)。
原子变量
原子变量执行速度非常块。
只要有可能编译器会把对原子变量的操作编译成单条指令。
[阅读全文] »
不明确的规则:每个线程不能第二次尝试获得该锁。
锁的顺序规则:保证每个线程都以相同的顺序获得锁。
锁的粒度对比:粗粒度锁会导致竞争严重,细粒度锁会导致额外的开销和给维造成副作用
大量的读取者,只有一个写入者可以使用免锁算法。
免锁算法类似于循环队列(个人理解)。
原子变量执行速度非常块。
只要有可能编译器会把对原子变量的操作编译成单条指令。
[阅读全文] »
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,失败返回非零值。
读取者/写入者信号量允许有一个写入者和无穷多个读取者。
当只需要读取数据时使用读取者信号量,仅当需要写入数据时获得写入者信号量。
[阅读全文] »