Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用dispatch\u sync防止竞争条件_Iphone_Ios_Objective C_Grand Central Dispatch_Race Condition - Fatal编程技术网

Iphone 使用dispatch\u sync防止竞争条件

Iphone 使用dispatch\u sync防止竞争条件,iphone,ios,objective-c,grand-central-dispatch,race-condition,Iphone,Ios,Objective C,Grand Central Dispatch,Race Condition,我有一个NSManagedObjectContext的竞赛条件。我尝试了各种方法来防止使用NSManagedObjectContext上的锁出现这种情况。正如苹果建议的那样,使用dispatch_sync似乎是一种更好的方法。但我无法确定在使用dispatch_sync执行的块下使用的对象是否可以被两个不同的线程访问 以下是我想问的一个更清楚的问题: [[*Some Singleton class* instance].managedObjectContext executeFetchR

我有一个NSManagedObjectContext的竞赛条件。我尝试了各种方法来防止使用NSManagedObjectContext上的锁出现这种情况。正如苹果建议的那样,使用dispatch_sync似乎是一种更好的方法。但我无法确定在使用dispatch_sync执行的块下使用的对象是否可以被两个不同的线程访问

以下是我想问的一个更清楚的问题:

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

    // After fetching results do something in DB
假设上面的代码在使用dispatch\u sync执行的块中传递,如下所示:

    dispatch_sync(someConcurrentQueue, ^{
    [[*Some Singleton class* instance].managedObjectContext executeFetchRequest:request error:&err];
    // After fetching results do something in DB
});
在此块完全执行之前,任何其他线程都可以访问[Some Singleton class instance].managedObjectContext

好的,可以访问它。如果这是真的,那么对NSManagedObjectContext应用锁是否是防止这种竞争条件的唯一方法?

一如既往:这取决于

dispatch\u sync甚至更安全,dispatch\u barrier\u sync使调用它的队列同步执行块。在这样做时,它们会阻塞线程。这使得一种情况具有潜在的安全性:从同一线程进行访问。在这种情况下,您需要担心的是,您所做的任何读取都可能发生在对队列执行块之前。相应地计划


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

每个线程应该有一个NSManagedObjectContext,但问题是即使每个线程有单独的NSManagedObjectContext,这将如何防止争用条件。@EvolGate争用条件在线程中是不可避免的。你试图减轻严重的异常和未定义的行为比任何事情都要多。是的,这确实是一个设计缺陷,但我只想说一件事,我的客户给了我这段由其他人编写的代码。问题是代码太大了,现在可以改变设计了。。。可怜的穆罕默德。。我无法阻止在执行块之前进行任何读取。原因是有一个调度计时器在后台运行,它可能随时尝试访问该对象。我无法阻止。请提出建议。你可以很容易地解决这个问题。在你应该为此而被解雇之前,摆脱单身汉,让一些更集中的东西来管理数据库和上下文。您甚至可以提供一些方便,为您生成子上下文。好吧,即使我尝试删除singleton,我也无法理解单独的managedObjectContext如何在这里保存竞争条件。假设thread1访问数据库并找到一个需要删除的列。所以,在第一个线程删除它之前,其他线程访问该列,并尝试删除它。如何预防this@EvolGate我处理它的方式是通过串行调度队列强制执行所有操作。这样可以保证您的操作顺序,并且没有两个线程同时访问。