在Obj-C中,简单来说是什么意思:"CoreData不是线程安全的“
或者一般来说,什么是“不安全的线程”?
发布于 2010-12-29 02:32:52
只有在编写自己的代码或设计自己的API时,@d11wtq的答案才是正确的。
这在使用一组API时是完全错误的,在使用核心数据时更是错误的。
在使用Mac和iOS的上下文中,必须始终在使用系统API的上下文中考虑线程安全。比方说,即使使用NSArray,也意味着您正在使用系统API。
或者一般而言,什么是“不安全的线程”?
非线程安全API是一种不能同时从多个线程与API交互的API。还可能有一些额外的限制,这些限制最常涉及主线程。例如,在Mac和iOS上,几乎所有的绘制操作都必须发生在主线程上。
Apple文档假定线程安全是例外情况。也就是说,只有在文档明确声明线程安全的情况下,API才是线程安全的。如果没有提到线程安全,则必须假定API不是线程安全的。
在Obj-C中,用简单的术语来说是什么意思;"CoreData不是线程安全的“
这种说法并不完全正确,但这是一个稳妥的假设。
在核心数据的情况下,线程交互行为是extremely well documented。
简而言之,API的某些部分是线程安全的(例如,存储协调器),而这些部分显然不是线程安全的。虽然MOC提供了锁定和解锁方法,但您也可以使用外部锁定。但是不要这样做。它会降低效率,变得更加脆弱;这一点非常重要。一般来说,也不要使用内部锁定。CoreData针对每个线程/队列有一个上下文进行了优化。
(根据TC的反馈固定答案。谢谢。)
发布于 2010-12-28 19:32:53
更新|请参阅@bbum的答案。我承认我的答案是有缺陷的,@bbum是正确的。
如果某个东西被描述为“不是线程安全的”,这意味着没有采取任何特殊的预防措施来确保它不会在两个单独的线程试图同时使用它时崩溃。通常,要由多个线程使用的代码需要显式锁(或@synchronize块)来包装代码的各个方面。具体地说,如果两个线程同时写入对象/变量(因为它们将写入相同的内存地址),那么任何要修改的对象/变量几乎肯定会导致崩溃。类似地,如果一个线程正在读取一个变量,而另一个线程正在向该变量写入数据,则会返回垃圾,程序很可能会崩溃。
使用@synchronized、NSLock或POSIX mutex等,可以确保在任何给定时间只有一个线程可以执行特定的代码块。其他线程被阻塞,必须等待,直到锁被释放。使用锁会对性能造成轻微的影响(当然还有一些开发开销需要考虑),所以代码经常明确声明它不是线程安全的,这使得代码的采用者可以根据需要放置锁(或者将非线程安全的执行限制在单个线程中)。
有关线程和线程安全的更多信息,请参阅Apple文档:
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocThreading.html#//apple_ref/doc/uid/TP30001163-CH19-BCIIGGHG
https://stackoverflow.com/questions/4545531
复制相似问题