CoreData的含义是不是线程安全的?

时间:2010-12-28 11:04:08

标签: iphone objective-c multithreading nsthread

在Obj-C中,简单来说意味着什么; “CoreData不是线程安全的”

或者一般来说什么是“非线程安全”?

2 个答案:

答案 0 :(得分:23)

只有在编写自己的代码或设计自己的API 时,

@ d11wtq的答案是正确的

使用一组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的情况下,线程交互行为是extremely well documented

简而言之,API的一部分是线程安全的(例如,商店协调器),而且部分非常明确地不是线程安全的。虽然MOC提供了锁定和解锁方法,但可以也使用外部锁定。但不要。它效率低下,脆弱;非常重要。通常,也不要使用内部锁定。 CoreData针对每个线程/队列的上下文进行了优化。

(根据TC的反馈确定答案。谢谢。)

答案 1 :(得分:3)

更新|请看@bbum的答案。我接受我的答案有缺陷,@ bbum是正确的。

如果某些内容被描述为“非线程安全”,则意味着没有采取任何特殊预防措施来确保在两个单独的线程同时尝试使用它时不会崩溃。通常,由多个线程使用的代码需要显式锁定(或@synchronize块)包围代码的各个方面。特别是,如果两个线程同时写入它(因为它们将写入相同的内存地址),任何将被修改的对象/变量几乎肯定会导致崩溃。类似地,如果一个线程在读取变量而另一个线程正在写入变量时,将返回垃圾并且程序可能会崩溃。

使用@synchronizedNSLock或POSIX互斥锁等,确保在任何给定时间只有一个线程可以执行特定的代码块。其他线程被阻止,必须等到锁被释放。使用锁会有轻微的性能损失(当然还有一些开发开销需要考虑它们),所以代码经常明确声明它不是线程安全的,让你(代码的采用者)根据需要自己放置锁(或将非线程安全的执行限制为单个线程)。

有关线程和线程安全的更多信息,请参阅Apple文档:

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