再看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]);
        }
    });
}

死锁的表现为:


目录
相关文章
|
2月前
|
Java API 调度
【JavaEE】——多线程(join阻塞,计算,引用,状态)
【JavaEE】——多线程,join,sleep引起的线程阻塞,多线程提升计算效率,如何获取线程的引用和状态
|
8月前
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
64 3
|
9月前
|
安全 算法 关系型数据库
线程安全--深入探究线程等待机制和死锁问题
线程安全--深入探究线程等待机制和死锁问题
290 1
|
Java 数据库
【JavaSE专栏79】线程死锁,多个线程被阻塞,等待彼此持有的资源
【JavaSE专栏79】线程死锁,多个线程被阻塞,等待彼此持有的资源
|
Java 调度
《JavaSE-第二十一章》之线程的状态与中断
《JavaSE-第二十一章》之线程的状态与中断
115 0
|
安全 C++
c++的queue在多线程下崩溃原因分析
c++的queue在多线程下崩溃原因分析
|
缓存 安全 Java
JAVA Thread Dump分析线程竞争
JAVA Thread Dump分析线程竞争
108 0
|
运维 监控 数据可视化
Java - 死锁 Dead Lock 定位分析
Java - 死锁 Dead Lock 定位分析
145 0
线程 --- 死锁的一些原因总结
线程 --- 死锁的一些原因总结
177 0
线程 --- 死锁的一些原因总结
|
监控 Windows
艾伟:.Net 下跟踪线程挂起和程序死循环
.Net 下调试跟踪线程挂起和程序死循环   作者:Eaglet      .Net 下的程序调试相对C/C++要简单很多,少了那些令人头疼的指针越界的问题。不过当你的程序遇到如下问题时,依然非常棘手:      1. 进程异常终止。
1115 0

相关实验场景

更多