线程间数据同步常用的方法就是加锁,但会引发程序挂起延迟的现象,在实时性较高的程序中不可取。
而无锁编程也有很多方法,如
http://www.ibm.com/developerworks/cn/linux/l-cn-lockfree/index.html
文章中,对多不同层级的数据同步方法有着详细的介绍。
据其介绍,两线程间环形缓存区无锁的方法能够比较好的解决读写问题。
我采用环形队列作为环形缓冲区的数据结构。
环形队列的实现方式也可分为线性和链式。对数据个数大小已知或在某个范围内控的情况,采用线性结构的队列,效率比较高;而对数据数量未知的情况,可采用链式结构。
在组织数据结构时,应小心以下几点:
1. 此解决方法适用于两线程间的读写问题;
2. 读者与写者必须先读写数据,后更新索引;
3. 读者线程只操作(更改)头索引,写者线程只操作(更改)尾索引,不能某线程同时操作两个索引。
4. 注意读写可能会发生溢出overflow的状况。读写前,进行判空与满的操作,若满,则需要丢数据。
5. 对线性环形队列的容量,可以设置为2^n,目的是提高循环操作取模%的效率(索引是单向递增的情况)。
对于溢出丢数据的情况,改进方法:
<