2010-08-04 2 views
2

나는 내 응용 프로그램에서 NSOperationQueue있어NSOperations가 failsafe 방식으로 실행되도록하려면 어떻게해야합니까?

을 원하고 응용 프로그램이 종료하기 전에 모든 작업을 처리 얻을 것이 중요 무엇. 완료하기 전에

if ([NSThread isMainThread]) { 
    while ([[operationQueue operations] count] > 0) { 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]]; 
    } 
} else { 
    [operationQueue waitUntilAllOperationsAreFinished]; 
} 

는 어디서 NSOperation "동결"전에 내 코드에 문제가 발생했습니다 그것은 전체 큐를 차단 : 나는 종료하기 전에 NSOperationQueue이 비어 있는지 확인 종료에 다음 코드를 가지고 . 분명히 이런 상황에서, 내 코드는 예외를 던져야한다.

하지만 작업이 멈추고 대기열을 막는 이상한 일이 일어나지 않도록주의하고 응용 프로그램을 중단하지 않고 오류가 발견되지 않도록해야합니다.

내 쓰레기 솔루션

나는 그 작업을 마무리 큐에 시간 제한을 가하고 고려 중이 야. 그런 다음 시간 초과가 발생하면 예외가 발생하여 문제가 발생할 수 있습니다.

그러나 이것은 적절하지 않습니다. 이상적으로, 저는 작업이 완료되었는지 타이머에 의존하고 싶지 않습니다.

내 질문

더 나은, 확실히 내 작업을 안전, 방법은 냉동하지 않은 실패 있나요? 내가 이해한다면

+0

작업 방법이 "작동 중지"되었습니까? –

답변

4

... 당신은 ... 당신의 작업이 동결하지 않은 것으로 알고 싶어하게

  • ...
  • 당신은 당신의 모든 작업이 실행 완료 것으로 알고 싶어요. ..
  • 당신은 그와 the halting problem

행운을 빕니다를 해결하려면 ...된다.

현실적으로는 waitUntilAllOperationsAreFinished으로 수행중인 작업은 예상대로 진행됩니다. 각 작업을 감시하는 다른 클래스를 추가하여 너무 길게 실행하지 않도록 할 수 있습니다 (실행 예상 시간보다 10 배 길다). -cancelNSOperation (더 많거나 적은 타이머 접근 방식) . 그러나, 심지어는 절대 안전한 것은 아닙니다. -isCancelled (예 : 시스템 호출 내부)을 확인할 수없는 곳에서 작업이 차단 될 수 있기 때문입니다.

+0

위대한 답변을 주셔서 감사합니다, Dave. 타임 아웃 방식으로 너무 멀지 않다는 것을 안심시켜주는 것이 좋다. 나는 작업 대기열 시간 초과로 인해 충돌 할 수 있습니다. 그런 다음 적어도 여기에 문제가 있다는 것을 알고 있습니다. –

+0

위대한 답변, 감사합니다! – bentford

+1

글쎄, 정지 문제는 "어떤 알고리즘이 어떤 시점에서 정지할지 여부를 결정하는 알고리즘을 만들 수 있습니까?"라는 의미입니다. 늘어나는만큼 나는 OP가 그 광범위한 접근을하지 않을 것임을 이해한다 :) – radiospiel

1

radiospiel이 위의 의견에서 말했듯이 실제로 정지 문제는 찾고 있지 않습니다. 작업 길이에 대해 상한선과 하한선을 잘 수행 할 수 있다면 각 작업에 시간 창을 부여하고 작업이 완료되었는지 확인할 수 있습니다. 좋은 하한을 수행 할 수 없다면 이는 비효율적이됩니다. 또한 작업 중 무한 루프가있는 경우에는 현재 환경에 따라 다른 스레드를 굶어 버릴 수 있습니다. 그런 다음 운이 없습니다.

그들 중 정지 문제는 고전적인 컴퓨터 과학 실수 중 하나입니다. 당신은 항상 일반적인 문제가 필요하지 않습니다.참조 : http://valgrind.org/

관련 문제