Зачем ABAddressbookRef необходимо создавать для каждого потока? - PullRequest
9 голосов
/ 10 августа 2011

Apple говорит:

mpВажно: экземпляры ABAddressBookRef не могут использоваться несколькими потоки. Каждый поток должен создать свой собственный экземпляр.

Но почему?

Я знаю, что какой-то определенный класс или операции должны выполняться в главном потоке.

И я знаю, что некоторые объекты не являются поточно-ориентированными (что означает, что это вызовет проблемы, если к этим объектам одновременно будут обращаться два разных потока).

Но, если вы можете быть уверены, что к небезопасным для потока объектам обращается только один поток в любой момент, проблем не должно быть.

Правильно ли я понимаю до сих пор?

Что я не могу понять, так это почему некоторые объекты, такие как ABAddressbookRef, должны создаваться для каждого потока? Почему Apple говорит что-то подобное? Если Apple просто говорит, что она не защищена от потоков, Apple может сказать, что она небезопасна, будьте осторожны при обращении с ней. Но почему существует необходимость создавать по одному для каждого потока? Есть ли причина, по которой я не знаю?

Зависит ли реализация ABAddressbookRef от потока, который его создал?

PS: я помню, что Core Data также говорит, что ManagedObjectContext необходимо создавать для каждого потока, который его использует.

Ответы [ 2 ]

12 голосов
/ 01 июня 2012

Чтобы положить конец спекуляциям, я использовал платную поддержку, чтобы попросить Apple дать определенный ответ относительно ABAddressBookRef и нескольких потоков.

Вот что я спросил:

Там естьбыло много спекуляций по этому вопросу, и я решил, что хотел бы попросить определенного ответа у инженера, который хорошо осведомлен о деталях реализации ABAddressBook Framework.

Документация гласит: Важные экземпляры ABAddressBookRef не могутиспользоваться несколькими потоками.Каждый поток должен создавать свой собственный экземпляр.

Если я понимаю это буквально, это означает, что ABAddressBookRef должен создаваться в каждом блоке даже с последовательными очередями GCD, поскольку GCD не дает никаких гарантий о потоках помимо глобального основного потока.

Я хочу спросить, буквально ли это так, ИЛИ, достаточно ли этого, чтобы гарантировать, что никакие два потока не обращаются к одному и тому же ABAddressBookRef в одно и то же время в любой момент, который гарантируется частной последовательной очередью GCD.

И вот что я получил взамен от Apple.

Благодарим Вас за обращение в службу технической поддержки Apple Worldwide Developer.Я отвечаю, чтобы сообщить вам, что я получил ваш запрос о технической помощи.Это правильно.Это потому, что объект адресной книги никогда не должен пересекать границы потока. Таким образом, каждый блок должен иметь свой собственный экземпляр.

Это плохие новости.

2 голосов
/ 13 мая 2012

Но если вы можете быть уверены, что к небезопасным объектам в любой момент доступен только один поток, проблем не будет.

Да, и это именно то, что Appleговорит вам сделать:

Экземпляры ABAddressBookRef не могут использоваться несколькими потоками

Причина, как вы указали, заключается в том, что этиABAddressBookRef объекты (фактически c-структуры) не являются потокобезопасными.Вы также можете добавить блокировки, чтобы гарантировать, что два потока не обращаются (для чтения и записи) к ABAddressBookRef одновременно, используя @synchronized(addressBookRef) { }

...