2012-05-23 17 views
2

나는 애플의 문서 Concurrent Programming Guide를 읽고 있는데, 나는 그 OperationQueue가 일련의 작업이라고 생각한다. 이 문서는 대부분의 경우 NSOperationQueue에서 잠금을 사용하지 않는다고 전했다.NSOperationQueue에서 잠금이 필요하지 않습니까?

질문

  1. 어떻게 NSOperationQueue와 읽기 & 쓰기 작업을 구현하는 방법?

  2. 언제 NSOperationQueue에서 잠금을 사용합니까?

답변

10

작업 대기열이 반드시 연속 대기열 일 필요는 없습니다. [queue setMaxConcurrentOperationCount:1]을 호출하여 작업 대기열을 직렬 대기열로 만들 수 있습니다. 그렇지 않은 경우 기본적으로 NSOperationQueue이 동시입니다.

일반적으로 잠금을 요구하지 않도록 대기열에 제출하는 작업을 설계해야합니다. 그것은 당신의 책임입니다. 작업은 자체 포함되어야한다는 생각입니다. 실행하기 전에 제출해야하는 데이터로 구성해야합니다. 이 데이터는 개인용 사본이어야합니다. 다른 물건이 액세스하는 것과 동시에 조작이 액세스하고있는 것이되어서는 안됩니다. 작업이 실행되는 동안 개인 데이터로만 작동하고 프로그램의 다른 부분에는 액세스하지 않아야합니다. 작업이 완료되면 나머지 프로그램에서도 결과를 사용할 수 있어야합니다. (이것은 수동적 일 수도 있고, 그 결과를 그 자체의 속성들 중 하나에 저장하는 것만으로도 가능합니다.) 그런 다음 프로그램의 나머지 부분은 그것을 읽을 수 있습니다. 또는 활성화 될 수 있습니다. 다른 객체를 호출하여 결과를 보내십시오.)

NSOperationQueue 읽기 - 쓰기 잠금을 지원하지 않습니다. 이를 위해 pthread_rwlock API를 사용할 수 있습니다. 그러나 또 다른 방법은 장벽 작업과 함께 GCD 디스패치 대기열을 사용하는 것입니다. dispatch_queue_create()을 사용하여 개인 동시 대기열을 만듭니다. dispatch_[a]sync()으로 읽기 작업을 제출하십시오. dispatch_barrier_[a]sync()을 사용하여 쓰기 작업을 제출하십시오.

+1

+1 훌륭한 답변, 특히 마지막 단락. –

+0

고마워. 그리고 나는 조금 더 질문이있다. 필자는 많은 읽기 - 쓰기 작업이 있다고 가정합니다. 하나의 OperationQueue 및 [queue setMaxConcurrentOperationCount : 1]에 이들 모두를 추가 할 수 있습니까? – studyro

+0

모든 조작을 직렬 대기열 (최대 동시 계수가 1 인 대기열)에 제출하면 직렬화됩니다. 한 번에 두 개씩 실행되지 않으므로 서로 간섭하는 것에 대해 걱정할 필요가 없습니다. 안전하지만 독자적으로 효율적이지 않을 수도 있습니다 (독자에 따라 동시성이 없기 때문에 안전 할 수도 있습니다). –

관련 문제