2013-06-12 1 views
2

내가 세마포어가 0보다 큰IOS 세마포어 대기는

sema = dispatch_semaphore_create(2); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //signals here 
}); 

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
dispatch_release(sema); 

은 대기가 대기해야하지 않겠 값으로 생성 된 dispatch_semaphore_wait (..)를 사용하는 데 문제가있어 기다리지 않는다 두 신호? 위 코드에서 전혀 기다리지 않고 릴리스가 호출되고 결과가 충돌합니다!

답변

4

아니요 작동 방식이 다릅니다. 스레드는 이전 두 개 중 하나가 신호 될 때까지 세 번째 대기에서 차단됩니다. 한 번에 얼마나 많은 스레드가 자원에 액세스 할 수 있는지 지정하는 시스템입니다. 더 많은 정보 here.

설명하는 방식으로 기다리고 싶다면 NSCondition 클래스를 사용할 수 있습니다.

5

이 동작을 얻으려면 세마포 대신 디스패치 그룹을 사용하십시오.

작업을 시작하기 전에 dispatch_group_enter()을 두 번 호출하여 그룹을 크기 2로 초기화하고 dispatch_group_wait()은 두 번째 전화가 dispatch_group_leave()이 될 때까지 대기합니다.