RTT CAS无锁机制

RTT CAS无锁机制

程序对数据操作流程:

        读数据   改写   回写

   

解决数据一致性问题

 

  1. 主存和独立工作区的数据一致性

volatile SIndexes _indxes; 主存中线程可见数据(不做缓存机制直接操作主存储器)

 

 

CachePtrType advance_w()

            {

                SIndexes oldval, newval;

                do

                {

                    oldval._value = _indxes._value; /*Points to a free writable pointer.*/

                    newval._value = oldval._value; /*Points to the next writable pointer.*/

                    // check for full :

                 if ((newval._index[0] == newval._index[1] - 1) || (newval._index[0] == newval._index[1] + _size - 1))

                    {

                        return 0;

                    }

                    newval._index[0]++;

                    if (newval._index[0] >= _size)

                        newval._index[0] = 0;

                    // if ptr is unchanged, replace it with newval.

                } while (!os::CAS(&_indxes._value, oldval._value, newval._value));

                // frome here on :

                // oldval is 'unique', other preempting threads

                // will have a different value for oldval, as

                // _wptr advances. As long as oldval has not been written,

                // rptr will not advance and wptr will remain stuck behind it.

                // return the old position to write to :

                return &_buf[oldval._index[0]];

            }

 

 

CAS(&_indxes._value, oldval._value, newval._value) 为false:

程序在行过程中,数据区已经让人串改过,结果已经不可信,那么继续执行程序并判。