1、产生死锁的条件:
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
在 iOS 并发编程中,我们要知道这几个基本概念:
串行(Serial):在固定时间内只能执行单个任务。例如主线程,只负责 UI 显示。
并发(Concurrent):在固定时间内可以执行多个任务。注意,它和并行(Parallel)的区别在于,并发不会同时执行多个任务,而是通过在任务间不断切换去完成所有工作。
同步(Sync):会把当前的任务加入到队列中,除非该任务执行完成,线程才会返回继续运行,也就是说同步会阻塞线程。任务在执行和结束一定遵循先后顺序,即先执行的任务一定先结束。
异步(Async):会把当前的任务加入到队列中,但它会立刻返回,无需等任务执行完成,也就是说异步不会阻塞线程。任务在执行和结束不遵循先后顺序。可能先执行的任务先结束,也可能后执行的任务先结束。
同步&异步
同步: 不能开启新的线程,一个任务没有结束就不会执行下一个任务
异步: 一定能开启新线程(主线程开异步是不会开启新线程的),不用等待任务执行完毕,就会执行下一个任务。
串行队列&并行队列 (都是按照FIFO执行顺序)
串行队列:任务以FIFO从队列里面一个一个执行。一个任务执行完毕后,才执行下一个任务。(在串行队列最多只会开一个线程)
并发队列:任务以FIFO在队列中出去,然后并发运行。执行完成的顺序不可控。
在主队列中添加同步任务会产生死锁,进而导致程序崩溃。
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"main==%@", [NSThread currentThread]);
});
block 要在主线程中执行。主线程是串行队列,在等block执行完成。所以block 执行不了。
在全局队列
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"==%@", [NSThread currentThread]);
});
global是并发队列,不用等block 执行完成才返回。block可以执行,没有问题。