代码之家  ›  专栏  ›  技术社区  ›  Neal.Marlin

如何理解NSMutableSet的成员测试和添加竞争条件?

  •  0
  • Neal.Marlin  · 技术社区  · 7 年前

    当我阅读Objective-C 2.0phrasebook一书时,有些关于NSMutableSet的东西我不太明白,如下所示,

    测试字符串是否在 如果它不是线程安全的版本,则设置并添加新的 会要求你在 -member: 打电话,发这个 再次发送消息,然后在添加新的 反对。

    我不明白我为什么要

    再次发送此消息

    是不是说我应该 -成员: 再打电话?请帮帮我。 任何代码示例将非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   rob mayoff    7 年前

    在Objective-C中,一个类似于 [mySet member:candidate] 发送名为 member: mySet (接受者)与论据 candidate . 它通常被称为方法调用或仅仅是调用,但是 it’s more properly called “sending a message” 或者是一个E-YY消息,发送一个O.*,因为在一个Objto-C消息发送中,比像C++或Java这样的更通用语言的方法调用有更多的机器(和定制的机会)。

    所以是的,当书上说“再发一次信息”时,意思是 [mySet成员:候选人] 再一次。我没看过这本书,但你的话描述的是双重检查锁定模式。

    然而,这本书所描述的是 不够 如果你要进入相同的比赛环境 NSMutableSet 从多个线程(如果您只访问 不可变集 从一根线)。问题是,如果你说 [mySet addObject:newMember] 在线程A上,它是 不安全 进入 mySet公司 在执行 addObject: 方法,该集合可能处于内部不一致状态,可能(例如)导致 成员: 调用另一个线程崩溃。你必须锁上 阅读 访问 mySet公司 除了写访问,所以双重检查的锁定模式对于共享 不可变集 穿过线。

    处理这个问题的最好方法是使用 dispatch_queue_t 管理对 不可变集 ,除非探查器告诉您这是一个瓶颈,否则不要担心任何更复杂的问题。