RTT CAS无锁机制
程序对数据操作流程:
读数据 改写 回写
解决数据一致性问题
- 主存和独立工作区的数据一致性
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:
程序在行过程中,数据区已经让人串改过,结果已经不可信,那么继续执行程序并判。