GCD 시작 소개 3 – 스레드 고정 잠금 장치

GCD는 iOS 개발자에게 많은 편의를 제공하고 기능도 강하다.그러나 NSOperation에서는 작업을 취소하고 종속 기능을 추가할 수 없습니다.하지만 GCD가 잘못 쓰거나 잘못 쓰면 라인이 끊어지는 경우가 있다.나는 몇 가지 예를 통해 설명할 것이다.
예1:
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSLog(@"--------1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"-------2");
    });
    NSLog(@"-------3");
}
GCD Queue는
1. main queue: 메인 라인, 메인 라인은 이 대기열에 있습니다.
2. Global queues: 전역 동시 행렬.
3. 사용자 대기열: 함수 dispatch 사용queue_create에서 만든 사용자 정의 대기열
dispatch_sync 및 dispatchasync 차이점
dispatch_sync 동기화 대기열, dispatchsync 함수는 즉시 되돌아오지 않습니다. 현재 라인을 막고 Block이 동기화될 때까지 기다립니다.
dispatch_async 비동기 대기열,dispatchasync 함수는 즉시 되돌아오고 Block은 백엔드에서 비동기적으로 실행됩니다.
위 코드 분석:
결과 내보내기
2015-12-11 11:28:40.502 test003[4276:148470] --------1

viewDidLoad는 주 스레드(dispatch get main queue()에서 sync로 실행될 때 dispatchget_main_queue () 동기화 라인을 삽입합니다.sync는 다음에 Block이 실행될 때까지 기다렸다가 돌아올 것입니다.sync가 또 디스패치get_main_queue () 대기열에서, 이것은 직렬 대기열입니다.sync는 뒤에 추가되었고, 이전 대기열은 주 라인입니다.sync가 Block을 실행하려면 주 라인이 실행되기를 기다려야 합니다.주 루틴은sync가 되돌아오기를 기다리며 후속 내용을 실행합니다.sync는mainThread가 실행되기를 기다리고,mainThread는sync 함수가 되돌아오기를 기다리며, 사라진 자물쇠로 비친다.
예2:
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    dispatch_async(dispatch_get_global_queue(0,0), ^{
        NSLog(@"-------1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"-------2");
        });
    });
    NSLog(@"-------3");
}

결과 출력:
2015-12-11 13:55:14.166 test003[5174:194372] --------1
2015-12-11 13:55:14.168 test003[5174:194372] -------3
2015-12-11 13:55:14.195 test003[5174:194372] -------2
프로그램 실행이 완료되어 잠금이 사라지지 않습니다.
Async는 주 라인에 비동기 라인을 만들어서 전역 병렬 대기열에 추가합니다. Async는 Block이 실행될 때까지 기다리지 않고 바로 되돌아옵니다.
1.async는 즉시 되돌아오고viewDidLoad가 실행되며 메인 라인도 실행됩니다.
2. 전역 병렬 대기열에서 비동기 Block을 즉시 실행합니다. 인쇄 1은sync에 실행될 때 Block이 실행될 때까지 기다렸다가 되돌아옵니다.dispatchget_main_queue () 대기열의mainThread 실행이 완료된 후에야 Block을 호출합니다.
1과 2가 거의 동시에 실행되기 때문에 2는 전역 병렬 대기열에서 2가sync에 실행되었을 때 1은 이미 실행이 끝났거나 잠시 기다렸을 수도 있고mainThread는 곧 종료되고 2는 후속 내용을 실행합니다.
주 스레드가 막히면 2의sync는 실행할 수 없습니다.mainThread는 영원히 종료되지 않습니다.sync는 영원히 기다리고 있습니다
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    dispatch_async(dispatch_get_global_queue(0,0), ^{
        NSLog(@"-------1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"-------2");
        });
        NSLog(@"-------3");
    });
    
    NSLog(@"------     ");
    while (1) {
        
    }
    NSLog(@"-----2---     ");
    
}
인쇄는 다음과 같습니다.
2015-12-11 14:16:41.566 test003[5403:204633] -------1
2015-12-11 14:16:41.566 test003[5403:204585] ------     

좋은 웹페이지 즐겨찾기