Что подразумевается под CoreData не является потокобезопасным? - PullRequest
9 голосов
/ 28 декабря 2010

В Obj-C, что это означает в простых терминах; «CoreData не является потокобезопасным»

ИЛИ вообще, что такое "не безопасно для потоков"?

Ответы [ 2 ]

23 голосов
/ 28 декабря 2010

@ d11wtq правильный ответ только при написании собственного кода или разработке собственных API .

Это совершенно неверно при работе с набором API и совершенно неверно при работе с Core Data.

В контексте работы с Mac OS X и iOS безопасность потоков всегда должна рассматриваться в контексте работы с системными API. Даже использование, скажем, NSArray означает, что вы работаете с системными API.

ИЛИ вообще что такое "не нить сейф "?

Не поточно-безопасный API - это API, в котором вы не можете взаимодействовать с API из нескольких потоков одновременно. Также могут быть дополнительные ограничения, которые чаще всего связаны с основным потоком. Например, почти все операции рисования должны выполняться в главном потоке как в Mac OS X, так и в iOS.

В документации Apple предполагается, что безопасность потоков является исключительным случаем. Таким образом, API является поточно-ориентированным, только если документация явно заявляет о безопасности потоков . Если нет упоминания о безопасности потоков, вы должны предположить, что API не является потокобезопасным.

В Obj-C, что это значит в простом термины; «CoreData не является потокобезопасным»

Это утверждение не совсем верно, но это безопасное предположение.

В случае Core Data поведение взаимодействия с потоками чрезвычайно хорошо задокументировано .

Короче говоря, части API являются поточно-ориентированными (например, координатор хранилища), а части явно не являются поточно-ориентированными. В то время как MOC предоставляет методы блокировки и разблокировки, вы можете также использовать внешнюю блокировку. Но не надо. Это будет менее эффективным и более хрупким; значительно так. В общем, не используйте внутреннюю блокировку. CoreData оптимизирован благодаря наличию контекста для потока / очереди.

(Ответ исправлен на основе отзывов TC. Спасибо.)

3 голосов
/ 28 декабря 2010

ОБНОВЛЕНИЕ | Пожалуйста, смотрите ответ @ bbum. Я принимаю, что мой ответ неверен и @bbum верен.

Если что-то описывается как «не ориентированное на многопотоковое исполнение», это означает, что не было предпринято никаких особых мер предосторожности, чтобы гарантировать, что оно не будет аварийно завершено, если два отдельных потока попытаются использовать его одновременно. В целом, код, который должен использоваться более чем одним потоком, требует явных блокировок (или @synchronize блоков), охватывающих аспекты кода. В частности, любой объект / переменная, которая будет изменена, почти наверняка вызовет сбой, если два потока будут писать в него одновременно (так как они будут записывать по одному и тому же адресу памяти). Точно так же, если один поток читает переменную, а другой пишет в нее, будет возвращен мусор, и программа, скорее всего, вылетит.

Использование @synchronized, или NSLock, или мьютекса POSIX и т. Д. Гарантирует, что только один поток может выполнить определенный блок кода в любой момент времени. Другие потоки блокируются и должны ждать, пока не будет снята блокировка. Использование блокировок незначительно сказывается на производительности (и, конечно, некоторые затраты на разработку требуют думать о них), поэтому часто код прямо заявляет, что это не безопасно для потоков, оставляя вас, принимающего код, самостоятельно устанавливать блокировки по мере необходимости. (или ограничить выполнение не поточно-ориентированного режима одним потоком).

См. Документацию Apple для получения дополнительной информации о многопоточности и безопасности потоков:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocThreading.html#//apple_ref/doc/uid/TP30001163-CH19-BCIIGGHG

...