【问题标题】:Why would ABAddressbookRef need to be created for each thread?为什么需要为每个线程创建 ABAddressbookRef?
【发布时间】:2011-08-10 15:26:05
【问题描述】:

苹果说:

重要提示:ABAddressBookRef 的实例不能被多个使用 线程。每个线程都必须创建自己的实例。

但是为什么呢?

我知道某些特定的类或操作必须在主线程中完成。

而且我知道有些对象不是线程安全的(这意味着如果这些对象同时被两个不同的线程访问会导致问题)。

但是,如果你能确保线程不安全的对象在任何时候都只能被一个线程访问,那么应该没有问题。

到目前为止我理解正确吗?

我不明白的是,为什么需要为每个线程创建一些像 ABAddressbookRef 这样的对象?苹果为什么会这样说?如果只是它是线程不安全的,Apple 可以说它是线程不安全的,处理时要小心。但是为什么需要为每个线程创建一个呢?有什么我不知道的原因吗?

ABAddressbookRef 的实现是否依赖于创建它的线程?

PS:我记得 Core Data 还说需要为每个使用它的线程创建 ManagedObjectContext。

【问题讨论】:

    标签: ios thread-safety abaddressbook


    【解决方案1】:

    为了结束猜测,我通过付费支持向 Apple 询问了有关 ABAddressBookRef 和多线程的明确答案。

    这是我问的:

    关于这件事有很多猜测,我决定向一位非常了解ABAddressBook框架实现细节的工程师寻求一个明确的答案。

    文档指出: 重要的 ABAddressBookRef 实例不能被多个线程使用。每个线程都必须创建自己的实例。

    如果我从字面上理解,这意味着即使使用 GCD 串行队列,也必须在每个块中创建 ABAddressBookRef,因为 GCD 不对全局主线程之外的线程提供任何保证。

    我想问一下,这是否是字面上的意思,或者,是否足以确保在 GCD 私有串行队列确实保证的任何时刻没有两个线程同时访问同一个 ABAddressBookRef。

    这就是我从 Apple 那里得到的回报。

    感谢您联系 Apple 全球开发者技术支持。我正在回复通知您,我已收到您的技术援助请求。 那是对的。这是因为地址簿对象不应该跨越线程边界。 因此,每个块都必须有自己的实例。

    这是个坏消息。

    【讨论】:

      【解决方案2】:

      但是如果你能保证线程不安全的对象在任何时候都只能被一个线程访问,那么就没有问题了。

      是的,这正是 Apple 告诉你的:

      ABAddressBookRef 的实例不能被多个线程使用

      正如您所指出的,原因是那些 ABAddressBookRef objects(实际上是 c 结构)不是线程安全的。您还可以使用@synchronized(addressBookRef) { } 来添加锁以确保没有两个线程同时访问(用于读取或写入)ABAddressBookRef

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 2011-10-01
        • 2023-02-10
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        相关资源
        最近更新 更多