前两天跟同事交流了 无锁队列的问题,发现不少人对这个lock free的概念有些匮乏,这里就简单写个ringbuffer实现lock free的设计理念。 这里拿python举例子,ringbuffer其实就是个数组,单纯的数组结构肯定不能实现线程安全问题。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新.
需要几个变量:
生产者 index
消费者 index
数组大小
最重要的一个环节:
原子计数, python下是没有原子计数的,我们可以借助gcc的sync_fetch_and_add来实现原子计数。 可以参考这个项目 http://xiaorui.cc/?p=4613
伪代码:
(参照了一些github的ringbuffer实现,大同小异…)
# xiaorui.cc product_ptr = 0 consumer_ptr = 0 queue_count = 10000 ringbuffer = (None for i in range(queue_count)) def product(): while 1: if 生index - 消index > 500: sleep(xx) continue else: product_ptr ++ ringbuffer[product_ptr] = "data" def consumer(): while 1: if 消 <= 生: ptr = consumer_ptr ++ while 1: d = ringbuffer[ptr] if d is None: continue
END…