1

我有一个线程安全的类,一个取消令牌,它从不稳定的可变状态(未取消)转换为稳定的不可变状态(取消)。一旦实例变得不可变,我想在检查状态之前停止支付获取锁的成本。

这是对现在情况的简化:

-(bool) isCancelled {
    @synchronized(self) {
        return _isCancelled;
    }
}
-(bool) tryCancel {
    @synchronized(self) {
        if (_isCancelled) return false;
        _isCancelled = true;
    }
    return true;
}

以及我想尝试的:

-(bool) isCancelled {
    bool result;
    // is the following correct?
    // can the two full barriers be reduced to a single read-acquire barrier somehow?
    OSMemoryBarrier();
    result = _isCancelled != 0;
    OSMemoryBarrier();
    return result;
}
-(bool) tryCancel {
    return OSAtomicCompareAndSwap32Barrier(0, 1, &_isCancelled);
}

使用两个内存屏障是正确的方法吗?我应该如何期望它与获取锁的成本相比(在此处插入关于概要分析的标准)?有更便宜的方法吗?

4

1 回答 1

0

编辑:这听起来像是可能的过早优化。这种锁定获取是否会减慢速度?

Edit2:它可能的编译器优化将打败这一点。意识到。

如果您担心双重检查锁定的问题,也许dispatch_once()对您有用?

在这种情况下会双重检查锁定工作吗?

-(void) doSomething {
    if (!_isCanceled) { //only attempt to acquire lock if not canceled already
        @synchronized(self) {
            if (!_isCanceled) // now check again (the double check part)
                doSomethingElse();
        }
    }
}

阅读有关双重检查锁定的维基百科条目以获取更多信息

于 2013-10-21T17:35:10.053 回答