我有一个线程安全类,一个取消令牌,从不稳定的可变状态(未取消)转换为稳定的不可变状态(取消)。一旦实例变得不可变,我想在检查状态之前停止支付获取锁的费用。
现在简化现状:
-(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);
}
正确使用两种内存屏障吗?我怎么能期望它与获得锁的成本相比较(在这里插入关于分析的标准副词)?有更便宜的方法吗?
答案 0 :(得分: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();
}
}
}
阅读双重检查锁定wikipedia entry以获取更多信息