在Objective-C中进行原子读取

时间:2013-10-21 16:27:08

标签: objective-c multithreading atomic memory-barriers

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

现在简化现状:

-(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);
}

正确使用两种内存屏障吗?我怎么能期望它与获得锁的成本相比较(在这里插入关于分析的标准副词)?有更便宜的方法吗?

1 个答案:

答案 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以获取更多信息