《多处理器编程的艺术》读书笔记(7)--- CLH队列锁
摘要:ALock并发线程的最大个数为一个已知的界限N,同时也要为每个锁分配一个与该界限大小相同的数组。 就算一个线程每次只访问一个锁,同步L个不同对象也需要O(LN)大小的空间。CLHLock[代码] 类QNode的布尔型Locked属性记录了每个线程的状态。如果Locked为true,则对应的线程要么已经获得到锁,要么正在等待锁;如果Locked为false,则对应的线程已经释放了锁。线程被顺序地排入...
阅读全文
posted @
2009-10-23 22:32
汝熹
阅读(2211)
推荐(0) 编辑
《多处理器编程的艺术》读书笔记(6)--- 队列锁
摘要:在BackoffLock算法中有两个问题:1.cache一致性流量:所有线程都在同一个共享存储单元上旋转,每一次成功的锁访问都会产生cache一致性流量(尽管比TASLock低);2.临界区利用率低:线程延迟过长,导致临界区利用率低下。 可以将线程组织成一个队列来克服这些缺点。在队列中,每个线程检测其前驱线程是否已完成来判断是否轮到自己。让每个线程在不同的存储单元上旋转,从而降低cache一致性流...
阅读全文
posted @
2009-10-22 23:35
汝熹
阅读(824)
推荐(0) 编辑
《多处理器编程的艺术》读书笔记(5)--- 自旋锁(2)
摘要:争用指多个线程试图同时获取一个锁;高争用意味着存在大量正在争用的线程;低争用的意思与高争用相反。在TTASLock类中,setlock()方法使用了两个步骤:它不断地读锁,当锁看似空闲时,则尝试获得锁。如果其他的某个线程在第一步和第二步之间获得了锁,那么该锁极有可能存在高争用。显然,试图获得一个存在高争用的锁是一种应该回避的情形。此时线程获得锁的机会非常小,因为这种尝试将会导致总线流量的增加(导致...
阅读全文
posted @
2009-10-20 20:19
汝熹
阅读(531)
推荐(0) 编辑
《多处理器编程的艺术》读书笔记(4)--- 自旋锁(1)
摘要:任何互斥协议都会产生这样的问题:如果不能获得锁,应该怎么做?对此有两种选择。其一种方案是让其继续进行尝试,这种锁称为自旋锁,对锁的反复测试过程称为旋转或忙等待。在希望锁延迟较短的情形下,选择旋转的方式比较合乎情理。但只有在多处理器中旋转才有实际意义。TASLock[代码]TTASLock [代码] 从正确性的角度来看,TASLock和TTASLock算法是等价的:每一个算法都保证了无死锁的互斥。(...
阅读全文
posted @
2009-10-19 23:00
汝熹
阅读(795)
推荐(0) 编辑