Multithreading NSManagedObjectContext锁
我正在使用核心数据编写一个多线程应用程序 我的印象是,Multithreading NSManagedObjectContext锁,multithreading,macos,core-data,locking,Multithreading,Macos,Core Data,Locking,我正在使用核心数据编写一个多线程应用程序 我的印象是,-[NSManagedObjectContext锁]不能作为标准锁工作。作为概念证明,这里有一个在Xcode 3“命令行工具”模板“核心数据”风格之后构建的示例: int main(int argc,const char*argv[] { objc_startCollectorThread(); NSManagedObjectContext*上下文=managedObjectContext(); [上下文锁]; [上下文锁]; NSLog(@
-[NSManagedObjectContext锁]
不能作为标准锁工作。作为概念证明,这里有一个在Xcode 3“命令行工具”模板“核心数据”风格之后构建的示例:
int main(int argc,const char*argv[]
{
objc_startCollectorThread();
NSManagedObjectContext*上下文=managedObjectContext();
[上下文锁];
[上下文锁];
NSLog(@“hello world!(context=%@)”,context);
[上下文解锁];
[上下文解锁];
返回0;
}
这将导致死锁,而不是在Mac OS X 10.6.8或10.7.4下运行时,我有以下日志:
2012-07-18 16:53:40.206 test[20004:a0b] hello world! (context=<NSManagedObjectContext: 0x20000df40>)
2012-07-18 16:53:40.206测试[20004:a0b]你好,世界!(上下文=)
有人能告诉我发生了什么事吗
(如果我使用NSLock的实例而不是上下文,死锁将按预期发生)
这是一篇文章的摘录 锁 试图获取接收器上的锁定
-(无效)锁
讨论
此方法会阻止线程的执行,直到可以获取锁为止。应用程序通过要求线程在执行代码之前获取锁来保护代码的关键部分。一旦临界段过去,线程将通过调用unlock来放弃锁定
将此消息发送到托管对象上下文有助于框架理解多线程环境中事务的范围。最好使用NSManagedObjectContext的NSLocking实现,而不是使用单独的互斥对象
如果锁定(或成功tryLock)托管对象上下文,则进行锁定调用的线程必须具有一个retain,直到调用unlock为止。如果在多线程环境中未正确保留上下文,这将导致死锁
可用性
在Mac OS X v10.4及更高版本中可用。由于未知原因,在同一线程中发生的后续NSManagedObject锁似乎会被忽略 下面是另一个按预期工作的示例代码(执行时没有日志):
@实现NSManagedObjectContext(测试)
-(void)testLock:(id)发送方
{
[自锁];
NSLog(@“你好,世界!(上下文=%@)”,self);
[自动解锁];
}
@结束
int main(int argc,const char*argv[]
{
objc_startCollectorThread();
NSManagedObjectContext*上下文=managedObjectContext();
[上下文锁];
[NSThread detachNewThreadSelector:@selector(testLock:)toTarget:context with Object:nil];
睡眠(2);
}
注:
-(BOOL)[NSManagedObjectContext tryLock]
对于任何后续调用也返回YES