跨对象层次结构的同步对象的ivar?

时间:2016-08-14 19:37:06

标签: objective-c synchronization

我想在一个ivar中保持一个与其血统共享的根块中的记录。结果值不用于兄弟姐妹,而是用于不同的对象谱系。标量是

@property (assign) NSUInteger ceil;

并且正常合成为

@synthesize ceil;

但只能通过合成的住房对象访问(更新):

- (NSUInteger)nextCeil
{
    NSUInteger nextCeil = 0;
    //  The root (date) agenda keeps the master. When we fetch
    //  another ceil we clone it for our use as well. Later we
    //  can access this value in case we need to diagnose.
    @synchronized (self)
    {
        //  If we have a root go up there for value
        if (root)
        {
            nextCeil = [root nextCeil];
        }
        else
        {
            nextCeil = ++ceil;
        }
    }
    return nextCeil;
}

我的问题是,鉴于多线程的环境,这是安全/正确的吗?到目前为止,我没有遇到任何问题。

设计历史是这个根是其兄弟姐妹的核心,它有一个日期参考,根是以日为中心,而兄弟姐妹是以时间为中心的。为了唯一性,每天需要一个计数器,分配给以时间为中心的物体,但不存储在那里。

1 个答案:

答案 0 :(得分:0)

这可能没问题,但Apple似乎在他们的Thread Programming Guide中留下了怀疑的余地,包括说明:

  

注意:大多数类型的锁还包含一个内存屏障,以确保在进入关键部分之前完成任何先前的加载和存储指令

大多数?如果这涉及到您使用同一文档中涵盖的屏障的原子增量。

当然,除非您将这些方法用于对您的ivar的所有访问,否则这些方法都不安全。

HTH