两线程间无锁进行数据同步

线程间数据同步常用的方法就是加锁,但会引发程序挂起延迟的现象,在实时性较高的程序中不可取。


而无锁编程也有很多方法,如

http://www.ibm.com/developerworks/cn/linux/l-cn-lockfree/index.html

文章中,对多不同层级的数据同步方法有着详细的介绍。


据其介绍,两线程间环形缓存区无锁的方法能够比较好的解决读写问题。


我采用环形队列作为环形缓冲区的数据结构。

环形队列的实现方式也可分为线性和链式。对数据个数大小已知或在某个范围内控的情况,采用线性结构的队列,效率比较高;而对数据数量未知的情况,可采用链式结构。

在组织数据结构时,应小心以下几点:

1. 此解决方法适用于两线程间的读写问题;

2. 读者与写者必须先读写数据,后更新索引;

3. 读者线程只操作(更改)头索引,写者线程只操作(更改)尾索引,不能某线程同时操作两个索引。

4. 注意读写可能会发生溢出overflow的状况。读写前,进行判空与满的操作,若满,则需要丢数据。

5. 对线性环形队列的容量,可以设置为2^n,目的是提高循环操作取模%的效率(索引是单向递增的情况)。


对于溢出丢数据的情况,改进方法:

<
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值