KFIFO无锁队列

来源:互联网 发布:网上上课软件免费 编辑:程序博客网 时间:2024/06/06 09:48

linux内核中实现了以非常漂亮的无锁队列,在只有一个读者和一个写者的情况下,无需上锁,而拥有线程安全的特性,使得性能相比于加锁方式实现的队列提升数倍

KFIFO的分析可见http://blog.csdn.net/chen19870707/article/details/41083183
这位作者讲的很清楚

KIFIO可以实现无锁队列,但是为什么可以实现呢,通过这种方式为什么可以线程安全?换句话说,平时实现的为什么会产生问题?
linux内核实现中有几个trick
1、sbuffer ize设置为2的n次幂
2、使用&(szie-1)代替求余
3、使用整数自动溢出构成的一个环替代循环数组,最大的好处是判断满和空简单多了
4、先操作后计数的方法

回到问题?直接实现的队列为什么没有线程安全特性
造成数据混乱自然是多线程同时修改读指针和写指针造成,最重要的一点是先修改指针然后读取数据,如果修改完指针以后,线程被切换,而此时却没有成功的把数据复制过去或者没有复制完整,那么刚好取得当前不成功存入的或还没有存入的数据,那么就造成了线程不安全

而KFIFO中,那么多的trick,我认为能够产出线程安全的一个就是调换改变指针和输入\输出数据的顺序。

在输入\输出指针没有真正改变之前,始终无法真正的读取到当前的值,而一旦指针改变。那么读取也就安全了。

0 0