美高梅4858赌场美高梅4858赌场作为华人首选娱乐平台,拥有澳门赌场、菲律宾双执照,美高梅集团游戏网址(www.4858.com)与亚洲最大的博彩软件提供商BBIN进行技术合作,致力于打造亚洲第一博彩集团。
当前位置:

环形缓冲区为什么是lock-free的?

作者: 美高梅4858赌场|来源: http://www.ff-coffee.com|栏目:www.4858.com|    日期:2020-01-04

文章关键词:

美高梅4858赌场,环形缓冲

  circular buffer 的 lock-free 的原理是什么? 怎么感觉两个下标还是要加锁呢. 维基这一段上说 Record last operationAnother solution is to keep a flag indicating whether the most recent operation was a read or a write. If the two pointers are equal, then the flag will show whether the buffer is full or empty: if the most recent operation was a write, the buffer must be full, and conversely if it was a …

  专业造轮子,拉黑抢前排。/div

  以前我也想过怎么让多个人可以同时使用环形缓冲区,然后发现在满了的时候根本没法进行lock-free的安全的错误处理。

  ring buffer的lock free(绝对无锁)必须有三个前提,cpu支持内存栅栏,数据的地址必须是四对齐的,一生产者一消费者,否则 是不安全的,cas是有aba问题的,所以不能考虑。

  环形缓冲区(就是一个队列吧)可以有lock free的实现。具体原因在于,每一个producer或者consumer,都不需要对整个数据结构独占,不需要对整个数据结构加锁。他们做的都只是移动head、tail。这样自然可以通过对head和tail的原子操作实现。

  //for i in (old_head, old_head+len)

  可以看下Lamport关于Lock-free queue的论文,现在回家了我也不方便搜答主可以看看

  Lock-free是一种同步方法。Circular buffer是lock-free的说法从严格角度是不对的,但的确lamport首先以这一数据结构提出了一种不使用锁或者叫互斥来同步读写二者的方法。@有为的答案指明了这一点。

  至于为什么不满足lock-free是因为还要看写满读空的策略才能决定这一点。

  你知道什么是lock-free吗,为什么你认为lock-free和synchronization是矛盾的啊?

  这需要CPU支持原子操作的原语,然后用一些原子操作把多个读、写互相排开。

  按我的经验,是可以有多个读、写线程的,不需要局限于单读单写。单读单写甚至可以做成wait-free。

  没看出这段文字哪里有说circular buffer是lock-free,有没有更多的上下文?原文的意思应该是在circular buffer的基础上,通过CAS来实现lock-free,而不是说circular buffer本身是lock-free的。

  首先应该明确下概念,lock free是说还是可以用CAS之类的原子锁的,连CAS都不用的叫wait free。

  lock free的ring buffer是可以实现的,可以参考DPDK中的实现。满足一定的假设的情况下,wait free也是可以实现的。

  我觉得环形缓冲只能保证两人读和写之间无lock,如果的多人的读-读、或写-写,还是必须有lock。另外,为了判断是否满,也必须要有lock,只不过这个lock可以通过技巧使得lock时间极短、高效,可以忽略。

  补充:环形缓冲,可看做是双缓冲的变形,只是为了节省内存把两个缓冲放到同一个内存段里而已。所以,理解了双缓冲,就很容易理解环形缓冲。

  需求是个数据采集系统。需要监听非标准波特率(250kbps)四个UART传来的数据包。数据包有各种格式,大小长度周期无假设。收到后解析处理再打包从SPI发出。

  原来的实现由于包长度不一,不好设定长触发DMA,又要考虑时延小,怕包尾收不满DMA挂在那等下一个包来撑满。所以没用DMA。结果就来一个字节产生一个中断处理,把数据塞入内存中FIFO队列待处理。最后CPU时间全都用在中断调用压堆栈上了,没时间解包再发送了。

  研读DS后将四个DMA都设置为连续接收模式,处理周期200Hz下每个DMA控制器的地址寄存器 DMAxSTA指向长度为250000/(8+1+1)/200=125字节的dual-ported SRAM 空间,以保证队列不要被撑爆。

  这样,将DMAxSTA寄存器当作队列头部指针,由DMA控制器在接收到UART的数据后从DMA Bus写入并向后移动指针,且超过125次接收后自动回到初始地址。就是标准的loop buff。

  我这边程序则四个进程,每个进程维护各自队列的尾部指针,每5毫秒定时wake up,然后从CPU Bus读光这个loop buff再解析处理。

  如此就避免了大量的中断占用CPU,处理逻辑也集合到一起便于维护。这样针对的设计也避免用到锁,而且连题主引用中的标志位也不用了(因为设计上不会出现满的状态)。

文章标签: 美高梅4858赌场 ,环形缓冲

 上一篇:给汽车加尾翼会起到什么作用?

 下一篇:算法练习(45): 环形缓冲区(1339)