lock free的循环队列

原创 2011年02月26日 19:08:00

1. 如果是一个生产者和一个消费者,则只需对读写index的更新是原子的就可以了,这种情况下只需要两个atomic的变量就搞定

2. 如果是多个生产者,则采用这种方式:

 a. 生产者原子的预定一个写的位置

         int curWriteIndex = writeIndex;

         do{

              curWriteIndex = wirteIndex;

         }while(cas(writeIndex,curWriteIndex,curWriteIndex + 1))

   采用cas原子地获取一个slot,然后写入

  b. writeIndex指向的位置不一定可读,因此,需要一个新的变量来指示当前读的位置,mReadIndex, 当a操作完成后,用cas指令更新这个变量

        int curReadIndex = mReadIndex;

         do{

             curReadIndex = mReadIndex;

        }while(cas(mReadIndex,curReadIndex,curReadIndex + 1))

  c. 如果两个写线程,thread 1 和 thread2, 先后通过a获取到了写入位置,那么他们执行b的顺序一定是与a的顺序一致,因此,如果某个线程执行b失败,那么表面他需要等待,此时最好让出cpu,因为他需要等待

d. 读线程:

         int index = readIndex;

         do{

             index = readIndex;

         }while(cas(readindex,index,index + 1))

       // 读index 的数据

 

 

 

3. 多个读,一个写:写的index 更新采用atomic的方式即可,读采用cas

 

 

 

相关文章推荐

lock free 单写多读的循环内存

lcok free 的单写多读循环内存从无锁的单写单读循环内存变化而来。所以这个问题分2节来介绍:   . 单写单独 循环内存   . lock free 单写多读循环内存 1. 常规的单写单...

自扩充的无锁(Lock-Free)并发环形队列算法

注:这是好早就发资源上的了,现在看起来似乎有更好的方法,先发帖吧,有兴趣的可讨论再做修改。 文档下载: http://download.csdn.net/download/guestcode/30...

无锁队列的环形数组实现(Lock Free Queue Implementation in Ring Array)

在多线程服务器中,需要对数据进行高并发的读写操作。

hdu1195Open the Lock(双向bfs+循环队列)

->题目请戳这里 题目大意:给2个长度为4的数字串,求从第一个串变到第二个串最少要几步。 每一步变换情况有: 1:每个数字+1,9+1 = 1; 2:每个数字-1,1-1 = 9; 3:某个...

Implementing Lock Free Queues

  • 2015年11月01日 12:39
  • 174KB
  • 下载

Lock+Now+Free

  • 2012年11月22日 11:46
  • 28KB
  • 下载

锁无关的(Lock-Free)数据结构,在避免死锁的同时确保线程继续

C/C++ Users Journal October, 2004  锁无关的(Lock-Free)数据结构  在避免死锁的同时确保线程继续  Andrei Alexandrescu  刘未鹏 译  ...

Lock-free Queue and Ring Buffer

  • 2011年12月24日 12:19
  • 626KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:lock free的循环队列
举报原因:
原因补充:

(最多只允许输入30个字)