怎样协调无锁异步队列的多个写入者( 二 )
■网友
虽然被人好意地邀请了...但是lockfree代码真的是看着脑仁儿疼........先mark一下等有空再细看吧,不过针对题主的疑问"没有防止两个疯狂的读写线程绕着环形buffer转一整圈,然后已经在你要写的地方写入了新的数据。"这个的一个有效方法是做dub-CAS,比如用来放数据的数组的尺寸当前是2^10,其最大的可能尺寸是2^32,那么计数器不要用32位,用64位计数器,然后不要轮回回来的值,让计数器永远+1,在真正取下标的时候再做求余操作. 同时在CAS的时候做cmpxchg64.这样,等于多出了32位的counter,每次计数器超过最大尺寸轮回回来,比如说轮回到1的时候,实际上是轮回到了2^32*1+1.这样你就可以检测出,到底是本来就在1,还是转了一圈回到1,又或者是转了N圈回到1.例如,假设数组尺寸是16,一个写线程A从"写下标"首先get()了一个下标0,然后线程被yeid,另一个线程B疯狂地写满了数组并且绕了回来,不做dub-CAS,此时的"写下标"又回到了0,A的CAS就会成功然后代码逻辑就出错了.但是用dub-CAS,"写下标"此时并没有回到0,而是变成了16,做CAS就会失败,程序逻辑就对了.话说题主居然也用juce.........lockfree果然是搞音频的人的宿命........
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义
