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