- 论坛徽章:
- 0
|
最近在考虑无锁数据结构,Harris有关于这方面集大成的一篇介绍CPWL《Concurrent_Programming_Without_Locks》,其中介绍到一般情况下实现所需的MCAS操作。
对于其中实现MCAS的提到的CCAS我有些不太理解,我认为它等同于一个直接的CAS交换再加上后续的比较操作,根据介绍CCAS主要是通过保证CAS和条件判断的线性化而提出的,这也跟我的理解应该是一样,因此我认为可以省略掉CCAS部分,而直接按照下述伪代码实现其中的MCASHelp(在原有基础上修改):- bool MCASHelp (MCASDesc *d) {
- word *v, desired := FAILED;
- bool success;
- /* PHASE 1: Attempt to acquire each location in turn. */
- for ( int i := 0; i < d->N && d->status = UNDECIDED; i++ )
- v := *d->a[i];
- while ( v != d && d->status = UNDECIDED ) {
- if ( IsMCASDesc(v) ) {
- MCASHelp((MCASDesc *)v);
- } else {
- if (v != d->e[i]) goto decision point;
- if (CAS(d->a[i], d->e[i], d)) break;
- }
- v := *d->a[i];
- }
- }
- desired := SUCCESSFUL;
- /* PHASE 2: No read-phase is used in MCAS */
- decision point:
- CAS(&d->status, UNDECIDED, desired);
- /* PHASE 3: Release each location that we hold. */
- success := (d->status = SUCCESSFUL);
- for ( int i := 0; i < d->N; i++ )
- CAS(d->a[i], d, success ? d->n[i] : d->e[i]);
- return success:
- }
复制代码 我想知道我的认识是否正确,如果不是这样,上述实现中跟原来有什么不同,存在什么问题?
谢过。 |
|