【问题标题】:Dead locks when using NSPrivateQueueConcurrencyType managed object context on two threads在两个线程上使用 NSPrivateQueueConcurrencyType 托管对象上下文时出现死锁
【发布时间】:2012-02-21 03:39:58
【问题描述】:

我正在使用NSPrivateQueueConcurrencyTypeNSManagedObjectContext,在以下情况下会发生死锁。

在后台线程上,调用 performBlock:。该块包含一个executeFetchRequest:error: 调用。

当该块正在执行时,主线程调用performBlockAndWait:。主线程等待,而后台线程的块完成。这很正常。

在后台线程块上调用executeFetchRequest:error: 时,会发生死锁。

我想executeFetchRequest:error: 正在等待performBlockAndWait: 完成的主线程。

这是一个错误吗?还是我不明白什么?对我来说,所有这些代码似乎都适用于 NSPrivateQueueConcurrencyType MOC。

【问题讨论】:

  • 这种情况不会经常发生,但是一旦发生,好吧……应用程序已经死了。

标签: iphone ios core-data concurrency deadlock


【解决方案1】:

NSPrivateQueueConcurrencyType 不会自动使 NSManagedObjectContext 线程安全。如果您需要在多个线程上使用 Core Data,您仍然应该为每个线程使用单独的上下文。

【讨论】:

  • 那么私有队列的意义何在?从文档中:“不是您创建和管理与上下文相关联的线程或队列,而是上下文拥有队列并为您管理所有细节(前提是您使用基于块的方法,如下所述)。 "在我看来,我应该使用基于块的方法并且只使用一个上下文。
  • 我对 NSPrivateQueueConcurrencyType 的理解是,它可以让你在私有线程上执行块操作,但你仍然需要手动避免从多个线程访问它所产生的竞争条件。再次阅读文档后,我不是 100% 确定...
  • 当我们在主线程上执行BlockAndWait: 时,我确保我们使用了 NSMainQueueConcurrencyType。暂时有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
相关资源
最近更新 更多