我有一个线程安全的类,一个取消令牌,它从不稳定的可变状态(未取消)转换为稳定的不可变状态(取消)。一旦实例变得不可变,我想在检查状态之前停止支付获取锁的成本。
这是对现在情况的简化:
-(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);
}
使用两个内存屏障是正确的方法吗?我应该如何期望它与获取锁的成本相比(在此处插入关于概要分析的标准)?有更便宜的方法吗?