2014-04-30 2 views
0

dispatch_semaphore_t의 상한값을 설정할 API가 없다는 것을 깨달았습니다. 세마포어 상한값을 1로 설정할 수 있으면 좋겠다. 내가 다음 코드를 테스트 대기가 작동하지 않습니다, 아무도 나에게 dispatch_semaphore_t의 상한선을 설정하는 방법을 알려주 수 있습니까?dispatch_semaphore_t에 대한 상한 설정 방법

- (dispatch_semaphore_t)taskSemaphore { 
     if (!_taskSemaphore) { 
     _taskSemaphore = dispatch_semaphore_create(1); 
     } 
     return _taskSemaphore; 
    } 

    - (void)testMethod { 
    dispatch_semaphore_signal([self taskSemaphore]); 
    dispatch_semaphore_signal([self taskSemaphore]); 
    dispatch_semaphore_signal([self taskSemaphore]); 
    dispatch_semaphore_signal([self taskSemaphore]); 
    dispatch_semaphore_signal([self taskSemaphore]); 

    dispatch_semaphore_wait([self taskSemaphore], DISPATCH_TIME_FOREVER); 
    dispatch_semaphore_wait([self taskSemaphore], DISPATCH_TIME_FOREVER); 
    dispatch_semaphore_wait([self taskSemaphore], DISPATCH_TIME_FOREVER); 
    } 
+0

한 번에 하나씩 만 허용하려면 잠금 장치를 사용하십시오. ''NSLock lock '','pthread_mutex' (아마도 당신의 경험 수준에서는 좋지 않다), 또는 단지 직렬 디스패치 큐 (serial dispatch queue)를 포함 할 수있다. – Kevin

+0

아니요, 요점은 아니에요, 여기에 예제를 올렸습니다. 2 ~ 3이 될 수 있습니다. – Pei

+0

그럼 임의의 한계를 만들 방법이 없다고 확신합니다. 내가 도우미 방법을 도출 할 수있을 것이라고 확신하지만, 아마도 이것이 최선의 해결책은 아닙니다. 이것은 [XY 문제] (http://meta.stackexchange.com/a/66378/172958)처럼 들립니다. 당신이 필요로하는 최종 결과는 무엇입니까? – Kevin

답변

0

dispatch_semaphore_t의 상한을 설정할 수 없습니다. 구현은 오히려 원시적 일 가능성이 큽니다. 반환 값에 따라 내부적으로 long을 사용하므로 상한선은 아마도 LONG_MAX 일 것입니다. 이 long은 원자 적으로 증가 또는 감소하고 long이 0 미만이되지 않는 모든 감소는 성공적으로 수행되고 그렇지 않으면 long이 다시 증가되어 스레드가 차단됩니다. 일단 차단되면 타임 아웃에 의해 깨어나서 시간 초과에 따라 작동이 실패하거나, 다른 스레드에 의해 long이 원자 적으로 증가 할 때마다 깨어나서 코드가이를 발생하도록합니다 또 한번 시도해. 이 시도는 실패 할 수도 있습니다. 두 개의 대기중인 스레드가 동시에 깨어 나고 실행될 수 있습니다.이 경우 하나는 더 빠를 것이고 다른 하나는 다시 차단되고 여전히 시간 초과 또는 다른 증가를 기다릴 것입니다. 오히려 원시 API를 넘어선 다른 것이 필요하다면, 자신 만의 세마포어를 만들어야합니다. 이것은 NSLock과 프리미티브 카운터를 기반으로하는 비교적 쉬운 일입니다.