我有这段代码,它是从不同的线程执行的。我无法找到僵局。也许我不知道@syncronized是如何工作的
@synchronized(self) {
NSLog(@"%@", self);
NSLog(@"(%d) Aloha hermano blocked?" ,pthread_mach_thread_np(pthread_self()) );
genres = [aContext executeFetchRequest:request error:&error];
if (error != nil) {
NSLog(@"Obj list fetch error: %@", error);
exit(-1);
}
NSLog(@"(%d) Aloha hermano NO" ,pthread_mach_thread_np(pthread_self()) );
}
当应用程序被锁定时,会看到跟踪:
2012-11-27 13:28:05.141 (15143) Aloha hermano blocked?
2012-11-27 13:28:05.146 (15143) Aloha hermano NO
2012-11-27 13:28:05.152 <STBConnection_0_9: 0xc676000>
2012-11-27 13:28:05.155 (15143) Aloha hermano blocked?
2012-11-27 13:28:05.161 (15143) Aloha hermano NO
2012-11-27 13:28:05.168 <STBConnection_0_9: 0xc676000>
2012-11-27 13:28:05.171 (15143) Aloha hermano blocked?
2012-11-27 13:28:05.178 (15143) Aloha hermano NO
2012-11-27 13:28:05.185 <STBConnection_0_9: 0xc676000>
2012-11-27 13:28:05.191 (1799) Aloha hermano blocked?
正如您所见,我总是在同一个对象上同步。
有什么想法吗?非常感谢
答案 0 :(得分:1)
Okey我修复了它,问题是我使用的是来自不同线程的相同ManagebObjectContext。在那种情况下,Apple文档说:
如果在线程之间共享托管对象上下文或持久性存储协调器,则必须确保从线程安全范围进行任何方法调用。对于锁定,您应该在托管对象上下文和持久性存储协调器上使用NSLocking方法,而不是实现您自己的互斥锁。这些方法有助于向框架提供有关应用程序意图的上下文信息 - 也就是说,除了提供互斥锁之外,它们还有助于范围操作集群。
因此,修复后的代码如下:
[aContext lock];
genres = [aContext executeFetchRequest:request error:&error];
if (error != nil) {
NSLog(@"Obj list fetch error: %@", error);
exit(-1);
}
[aContext unlock];