项目中基本上线程方面用的都是GCD,不经意间也许就会有死锁的产生。
死锁的产生是由于队列的堵塞造成的
产生死锁的四个必要条件:
1.互斥条件。指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只有一个进程占用.如果有其它进程请求资源,请求者只能等待,直到占有资源的进程释放完毕。
2.请求和保持条件。指进程已经保持至少一个资源,但又提出新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的资源保持不放。
3.不可剥夺条件。指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4.环路等待条件。造成的循环资源请求的进程链,造成了互相等待。
eg
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"1");
});
NSLog(@"2");
}
同步线程会造成死锁,一直不会打印,运行会直接报错。
最常见的死锁就是`同步函数`+`主队列`造成的队列阻塞
网友评论