IOS 직렬 대기 열 과 병렬 대기 열 이 동기 화 되 거나 비동기 화 되 는 인 스 턴 스 를 자세히 설명 합 니 다.

IOS 직렬 대기 열 과 병렬 대기 열 이 동기 화 되 거나 비동기 화 되 는 인 스 턴 스 를 자세히 설명 합 니 다.
IOS 에서 GCD 의 대기 열 은 직렬 대기 열과 병렬 대기 열 로 나 뉘 는데,작업 은 동기 화 작업 과 비동기 작업 으로 나 뉘 는데,이들 의 배열 조합 은 네 가지 상황 이 있 으 며,다음은 이 네 가지 상황 의 작업 방식 을 분석한다.
동기 화 작업,GCD dispatch 사용sync 할당 작업 진행

- (void)testSync {
  dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL);
  dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_CONCURRENT);

  NSLog(@"====serialQueue====");
  for (int i = 0; i<10; i++) {
    dispatch_sync(serialQueue, ^{
      [NSThread sleepForTimeInterval:0.3];
      NSLog(@"==>%@ sync serial XXX>%d", [NSThread currentThread], i);
    });
  }

  NSLog(@"====concurrentQueue====");
  for (int i = 0; i<10; i++) {
    dispatch_sync(concurrentQueue, ^{
      [NSThread sleepForTimeInterval:0.3];
      NSLog(@"==>%@ sync concurrent ====>%d", [NSThread currentThread], i*i);
    });
  }
}

결 과 는 다음 과 같다.

2017-03-01 01:36:22.835 Demo ====serialQueue====
2017-03-01 01:36:23.207 {number = 1, name = main} sync serial XXX>0
2017-03-01 01:36:23.578 {number = 1, name = main} sync serial XXX>1
2017-03-01 01:36:23.952 {number = 1, name = main} sync serial XXX>2
2017-03-01 01:36:24.325 {number = 1, name = main} sync serial XXX>3
2017-03-01 01:36:24.699 {number = 1, name = main} sync serial XXX>4
2017-03-01 01:36:25.072 {number = 1, name = main} sync serial XXX>5
2017-03-01 01:36:25.446 {number = 1, name = main} sync serial XXX>6
2017-03-01 01:36:25.746 {number = 1, name = main} sync serial XXX>7
2017-03-01 01:36:26.122 {number = 1, name = main} sync serial XXX>8
2017-03-01 01:36:26.489 {number = 1, name = main} sync serial XXX>9
2017-03-01 01:36:26.489 Demo ====concurrentQueue====
2017-03-01 01:36:26.864 {number = 1, name = main} sync concurrent ====>0
2017-03-01 01:36:27.236 {number = 1, name = main} sync concurrent ====>1
2017-03-01 01:36:27.611 {number = 1, name = main} sync concurrent ====>4
2017-03-01 01:36:27.985 {number = 1, name = main} sync concurrent ====>9
2017-03-01 01:36:28.354 {number = 1, name = main} sync concurrent ====>16
2017-03-01 01:36:28.726 {number = 1, name = main} sync concurrent ====>25
2017-03-01 01:36:29.100 {number = 1, name = main} sync concurrent ====>36
2017-03-01 01:36:29.474 {number = 1, name = main} sync concurrent ====>49
2017-03-01 01:36:29.849 {number = 1, name = main} sync concurrent ====>64
2017-03-01 01:36:30.223 {number = 1, name = main} sync concurrent ====>81
testsync 방법 은 메 인 스 레 드 에서 호출 되 었 습 니 다.그 결과 사용 하 는 직렬 대기 열과 병렬 대기 열 을 사용 하여 본 결 과 는 모두 현재 스 레 드 에서 발생 했 습 니 다.메 인 스 레 드 에서 새로운 스 레 드 처리 작업 을 시작 하지 않 았 고 작업 의 스케줄 도 직렬 스 케 쥴 링 입 니 다.
비동기 퀘 스 트,GCD dispatch 사용async 파견 퀘 스 트 진행

- (void)testAsync {
  dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL);
  dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_CONCURRENT);

  NSLog(@"====serialQueue====");
  for (int i = 0; i<10; i++) {
    dispatch_async(serialQueue, ^{
      [NSThread sleepForTimeInterval:0.3];
      NSLog(@"==>%@ async serial XXX>%d", [NSThread currentThread], i);
    });
  }

  NSLog(@"====concurrentQueue====");
  for (int i = 0; i<10; i++) {
    dispatch_async(concurrentQueue, ^{
      [NSThread sleepForTimeInterval:0.3];
      NSLog(@"==>%@ async concurrent ====>%d", [NSThread currentThread], i*i);
    });
  }
}
`

결 과 는 다음 과 같다.

2017-03-01 01:45:36.125 Demo ====serialQueue====
2017-03-01 01:45:36.125 Demo ====concurrentQueue====
2017-03-01 01:45:36.494 {number = 3, name = (null)} async concurrent ====>0
2017-03-01 01:45:36.494 {number = 5, name = (null)} async concurrent ====>4
2017-03-01 01:45:36.494 {number = 4, name = (null)} async concurrent ====>1
2017-03-01 01:45:36.494 {number = 6, name = (null)} async concurrent ====>16
2017-03-01 01:45:36.494 {number = 8, name = (null)} async serial XXX>0
2017-03-01 01:45:36.494 {number = 7, name = (null)} async concurrent ====>9
2017-03-01 01:45:36.494 {number = 9, name = (null)} async concurrent ====>25
2017-03-01 01:45:36.494 {number = 11, name = (null)} async concurrent ====>49
2017-03-01 01:45:36.494 {number = 10, name = (null)} async concurrent ====>36
2017-03-01 01:45:36.501 {number = 13, name = (null)} async concurrent ====>81
2017-03-01 01:45:36.501 {number = 12, name = (null)} async concurrent ====>64
2017-03-01 01:45:36.869 {number = 8, name = (null)} async serial XXX>1
2017-03-01 01:45:37.244 {number = 8, name = (null)} async serial XXX>2
2017-03-01 01:45:37.615 {number = 8, name = (null)} async serial XXX>3
2017-03-01 01:45:37.986 {number = 8, name = (null)} async serial XXX>4
2017-03-01 01:45:38.358 {number = 8, name = (null)} async serial XXX>5
2017-03-01 01:45:38.730 {number = 8, name = (null)} async serial XXX>6
2017-03-01 01:45:39.103 {number = 8, name = (null)} async serial XXX>7
2017-03-01 01:45:39.472 {number = 8, name = (null)} async serial XXX>8
2017-03-01 01:45:39.842 {number = 8, name = (null)} async serial XXX>9
testsync 방법 은 메 인 스 레 드 에서 호출 되 었 습 니 다.그 결과 직렬 대기 열 을 사용 하 는 비동기 작업 을 보면 키 스 레 드 를 열 어 작업 을 수행 합 니 다.작업 의 스케줄 링 은 직렬 입 니 다.
병렬 대기 열 을 사용 하 는 비동기 작업 은 여러 개의 하위 스 레 드 를 병행 하 는 처리 작업 을 시작 합 니 다.작업 의 우선 순 서 는 고정 되 지 않 고 작업 의 스케줄 링 방식 은 병행 합 니 다.
총결산
동기 화 작업:사용 하 는 대기 열 과 상 관 없 이 하위 스 레 드 처리 작업 을 시작 하지 않 습 니 다.현재 스 레 드 에서 직렬 로 배 치 된 작업 입 니 다.즉,하나의 작업 이 끝 난 후에 다음 작업 을 계속 합 니 다.동기 화 작업 이 주 스 레 드 에서 호출 되면 주 스 레 드 를 막 을 수 있 습 니 다.
비동기 작업:a.직렬 대기 열 을 사용 하면 하위 스 레 드 직렬 스 케 쥴 러 작업 b.병렬 대기 열 을 사용 하여 여러 개의 하위 스 레 드 병렬 스 케 쥴 러 작업 을 시작 합 니 다.이 경우 가장 많이 사 용 됩 니 다.
이상 은 IOS 직렬 대기 열 과 병렬 대기 열 을 동기 화하 거나 비동기 화 하 는 인 스 턴 스 입 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 커 뮤 니 티 에 가서 토론 을 하 십시오.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기