dispatch_queue_t에 대한 액세스를 제어하는 세마포가 있다고 가정합니다. 디스패치 큐에서 블록을 예약하기 전에 세마포 (dispatch_semaphore_wait)를 기다립니다.세마포어로 우선 제어
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER)
dispatch_async(queue){ //do work ; dispatch_semaphore_signal(semaphore); }
여러 개의 다른 위치에서 대기하는 것으로 가정 해 봅니다. 일부 "저작물"은 다른 "저작물"보다 우선 순위가 높습니다.
"작업"중 다음에 예약 할 작업을 제어하는 방법이 있습니까?
추가 정보 : "작업"이 여러 개의 블록이있는 자체 대기열로 구성되어 있기 때문에 세마포없이 연속 대기열을 사용하는 것은 나를위한 옵션이 아닙니다. 모든 작업 대기열이 실행되어야하며 그렇지 않은 경우가 있습니다. 작업 대기열을 동시에 실행할 수는 없습니다. 우선 순위 제어를 제외하고는이 모든 것이 정상적으로 작동합니다.
편집 : 좋아
(제레미에 대한 응답, 의견에서 이동), 당신은 어떤 프린터와 같은 장치/파일/있다고 가정합니다. 인쇄 작업은 트랜잭션에서 그룹화 된 여러 함수 호출/블록 (인쇄 머리글, 그림 인쇄, 텍스트 인쇄 등)으로 구성됩니다. 이 블록을 직렬 대기열에 넣으십시오. 트랜잭션 당 하나의 큐.
그러나 여러 개의 인쇄 작업/트랜잭션을 가질 수 있습니다. 다른 인쇄 작업/트랜잭션의 블록은 혼합 할 수 없습니다. 그렇다면 트랜잭션 큐가 모든 작업을 실행하고 다른 큐가 완료되기 전에 트랜잭션 큐가 시작되지 않도록하려면 어떻게해야합니까? (나는 이것을 인쇄하지 않고 그냥 예제로 사용한다).
세마포어는 유한 리소스 사용을 규제하는 데 사용됩니다. https://www.mikeash.com/pyblog/friday-qa-2009-09-25-gcd-practicum.html Concurrency Programming Guide
내가 알아 내려고 노력하고 다음 단계는 다른 전에 하나의 트랜잭션을 실행하는 방법입니다.
하나의 트랜잭션을 다른 트랜잭션보다 먼저 실행하는 것이 정확히 직렬 대기열을위한 것입니다. 각 트랜잭션을 큐에서 차단해야합니다. 우선 순위 반전으로 쉽게 이어질 수 있으므로 세마포어 사용을 버리십시오. –
좋아요, 우선 순위 반전과 재검토를하겠습니다. – user965972