再看Core Data中PSC陷入死锁的问题

简介:

在《Core Data Programming Guide》文档的Concurrency with Core Data这一章节中提到了“Use Thread Confinement to Support Concurrency”,这里的“Thread”还包含serial operation queue和dispatch queue。

我目前的理解是MOC会负责对PSC进行加锁解锁,这些动作需要保证有序地得到执行,如果两个thread同时访问一份context,尤其是其中一个进行写操作,另一个进行读操作,就很容易发生死锁:

- (void)runSave
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *moc = appDelegate.managedObjectContext;
        
        if (moc) {
            for (int j = 0; j < 10000; ++j) {
                
                NSString *threadPtr = [NSString stringWithFormat:@"%p", [NSThread currentThread]];
                [_threadDict setObject:@"Running Thread" forKey:threadPtr];
                
                People *people = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:moc];
                people.name = @"noname";
            }
            
            NSLog(@"**********IN SAVE %@", [NSThread currentThread]);
            NSError *error = nil;
            if ([moc save:&error]) {
                ;
            }

            NSLog(@"**********OUT SAVE %@", [NSThread currentThread]);
        }
    });
}

- (void)runFetch
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *moc = appDelegate.managedObjectContext;
        
        if (moc) {
            NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
            [fetchRequest setEntity:[NSEntityDescription entityForName:@"People" inManagedObjectContext:moc]];
            
            NSLog(@"~~~~~~~~~~IN FETCH %@", [NSThread currentThread]);
            NSError *error = NULL;
            NSArray *array = [moc executeFetchRequest:fetchRequest error:&error];
            if (array) {
                ;
            }
            NSLog(@"~~~~~~~~~~OUT FETCH %@", [NSThread currentThread]);
        }
    });
}

死锁的表现为:


目录
相关文章
|
6月前
|
Go
Go 如何解决 并发中的竞争状态
Go 如何解决 并发中的竞争状态
72 0
|
定位技术 API
百度地图开发:阻塞加载慢A parser-blocking, cross site的解决方案
百度地图开发:阻塞加载慢A parser-blocking, cross site的解决方案
505 0
|
3月前
|
存储 设计模式 Java
Go - 使用 sync.Pool 来减少 GC 压力
Go - 使用 sync.Pool 来减少 GC 压力
64 0
|
5月前
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
42 3
|
4月前
|
Java Go 调度
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
|
6月前
|
安全 算法 关系型数据库
线程安全--深入探究线程等待机制和死锁问题
线程安全--深入探究线程等待机制和死锁问题
183 1
|
运维 监控 数据可视化
Java - 死锁 Dead Lock 定位分析
Java - 死锁 Dead Lock 定位分析
118 0
|
Java 调度
【Java原理探索】深入分析Mutex锁的运行原理
【Java原理探索】深入分析Mutex锁的运行原理
241 0
|
监控 Windows
艾伟:.Net 下跟踪线程挂起和程序死循环
.Net 下调试跟踪线程挂起和程序死循环   作者:Eaglet      .Net 下的程序调试相对C/C++要简单很多,少了那些令人头疼的指针越界的问题。不过当你的程序遇到如下问题时,依然非常棘手:      1. 进程异常终止。
1084 0
|
关系型数据库 Java 数据库
APPARENT DEADLOCK!!! - C3P0连接池DeadLock机制分析
1 问题 近期,刚上线不久的生产系统的数据库连接池 C3P0 (版本为0.9.5.2)突然报出 APPARENT DEADLOCK!!! 错误。 1.1 错误日志 错误日志如下。
5241 0