GCD 신호량(dispatch semaphore)

4234 단어 다중 스레드
앞서 언급한 바와 같이 GCD 스케줄러를 사용하여 비동기 처리가 끝난 후에 마지막에 어떤 라인으로 돌아가서 집중적으로 처리할 수 있습니다. (다중 인터페이스 비동기 요청. 메인 라인으로 돌아가서 UI 리셋)스탬프:GCD 스케줄러(dispatch group)
이것은 우리가 이 수요를 실현할 수 있는 GCD 신호량(Semaphores)에 대해 이야기하자
주로 아래의 몇 가지 물건들이다
//    dispatch_semaphore_t

//    dispatch_semaphore_create()
//    dispatch_semaphore_wait(, )
//    dispatch_semaphore_signal()

1.dispatch_semaphore_t
dispatch_semaphore_t dispatchgroup_이런 물건이면 돼요.신호량을 만들면 이 물건을 되돌려줍니다.
2. 함수 만들기
dispatch_semaphore_create ()가 롱 형식 데이터를 전송합니다.디스패치 반환semaphore_t. 그러나 이 롱 형식의 데이터는 0보다 작을 수 없고, 0보다 작으면 NULL로 돌아간다.
3. 신호량 감소 대기
//    dispatch_semaphore_wait(, )

이 선후 순서는 결코 묘사하기 어렵다.코드 상하 구조로 보면분명히 먼저 신호량을 높였지만 집행 순서상 신호량을 낮추기 전이었다.
4. 신호량 증가
//    dispatch_semaphore_signal()

신호량을 높이면 그것과 짝을 이루는wait를 실효시킬 수 있다.그리고 계속 아래로 내려가세요.그는 wait가 없을 때 0으로 되돌아오는 롱 형식의 반환 값을 가지고 있다.
주의: 신호량은 스케줄러와 다르기 때문에 먼저 신호량을 낮춘 다음에 높여야 합니다.쌍이 맞지 않으면 EXC_BAD_INSTRUCTION 오류가 발생할 수 있고, 신호량을 먼저 낮추면 코드가 끊길 수 있습니다
사용 용례
///    GCD Semaphores
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

dispatch_async(dispatch_get_global_queue(0, 0), ^{
	NSLog(@"1");
	dispatch_semaphore_signal(semaphore);
});
NSLog(@"5");
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"6");

dispatch_async(dispatch_get_global_queue(0, 0), ^{
	NSLog(@"2");
	dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

dispatch_async(dispatch_get_global_queue(0, 0), ^{
	NSLog(@"3");
	dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSLog(@"4");


출력 결과는516234다선정과 관련된 것에 대해서는 여러 차례 테스트를 해야만 정확한 결론을 얻을 수 있다
시간 지연 테스트를 해보도록 하겠습니다.
    ///    GCD Semaphores
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"1");
        dispatch_semaphore_signal(semaphore);
    });
    NSLog(@"5");
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"6");

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"2");
        dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"3");
        dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"4");

출력 결과는 5.1.6.2.3.4
그럼 바로.계속 순서대로 집행하다.디스패치가 닿으면...semaphore_wait.그는 시그널 신호량을 받을 때까지 기다렸다가 내려갈 것이다.아니면wait의 두 번째 매개 변수(최대 대기 시간)가 도달할 때까지 기다린다(신호량을 받은 셈이다).따라서wait 전에 비동기 임무를 작성하고singal 신호를 보내거나 최대 대기 시간을 보내야 합니다.안 그러면 렉 걸려.(바로wait하면 라인이 막힙니다. 아래는 가지 않습니다. 비동기 퀘스트를 아래에서 켜면 켜지지 않은 것과 같습니다.)
GCD의semaphore는 여러 작업을 수행하기 위해 일정한 순서로 수행하는 데 비교적 적합하다
///    GCD Semaphores
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

dispatch_async(dispatch_get_global_queue(0, 0), ^{
	[NSThread sleepForTimeInterval:2];
	NSLog(@"1");
	long longValue = dispatch_semaphore_signal(semaphore);
	NSLog(@"1.longValue:%ld" ,longValue);
});

dispatch_async(dispatch_get_global_queue(0, 0), ^{
	[NSThread sleepForTimeInterval:1];
	NSLog(@"2");
	long longValue = dispatch_semaphore_signal(semaphore);
	NSLog(@"2.longValue:%ld" ,longValue);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

dispatch_async(dispatch_get_global_queue(0, 0), ^{
	[NSThread sleepForTimeInterval:2];
	NSLog(@"3");
	long longValue = dispatch_semaphore_signal(semaphore);
	NSLog(@"3.longValue:%ld" ,longValue);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSLog(@"4");

만약 위의 이런 것이라면, 1과 2의 인쇄 순서는 반드시 그렇지는 않을 것이다.따라서 GCD Semaphores는 작업 수행 순서를 사용자 정의하는 데 적합합니다.

좋은 웹페이지 즐겨찾기