GCD 시작 소개 3 – 스레드 고정 잠금 장치
예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] ------
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약 동료는 무심결에 이 문제를 제기하고 두 가지 방법을 직접 실천했다.물론 더 좋은 방법이 있을 거야. 방법 1 이런 방법은 비교적 흔히 볼 수 있는 해결 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.