使用dispatch_sync防止竞争条件

时间:2013-06-14 03:51:54

标签: iphone ios objective-c grand-central-dispatch race-condition

我遇到了 NSManagedObjectContext 的竞争条件。我正在尝试使用NSManagedObjectContext上的锁来防止这种情况的各种方法。使用dispatch_sync似乎是一个更好的方法,如apple所示。但是我无法弄清楚是否可以通过两个不同的线程来保存一个对象(在使用dispatch_sync执行的块下使用)不被访问

以下是我想要问的更清晰的图片:

    [[*Some Singleton class* instance].managedObjectContext executeFetchRequest:request error:&err];

    // After fetching results do something in DB

假设上面的代码在使用dispatch_sync执行的块中传递,如下所示:

    dispatch_sync(someConcurrentQueue, ^{
    [[*Some Singleton class* instance].managedObjectContext executeFetchRequest:request error:&err];
    // After fetching results do something in DB
});

任何其他线程都可以在此块完全执行之前访问[某些Singleton类实例] .managedObjectContext。

可以访问AFAIK。如果这是真的,那么在NSManagedObjectContext上应用锁定是防止这种竞争条件的唯一方法吗?

1 个答案:

答案 0 :(得分:0)

一如既往:取决于

dispatch_sync(它甚至更安全的堂兄dispatch_barrier_sync)导致它被调用的队列同步执行该块。这样做会阻止线程。这使得一个案例可能是安全的:从同一个线程访问。在这种情况下您需要担心的是,您执行的任何读取都可能在块在队列上执行之前发生。相应地计划。

但这忽略了代码中的一个巨大缺陷。托管对象上下文应该从不在线程之间共享,甚至分派到与创建它们的线程不同的线程。您可以通过简单地生成子上下文来修复并发访问问题。