前两天跟同事交流了 无锁队列的问题,发现不少人对这个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…
