2

私が欲しいもの

アプリケーションに NSOperationQueue があり、アプリケーションが終了する前にすべての操作が処理されることが重要です。終了する前に NSOperationQueue が空であることを確認するために、終了時に次のコードを取得しました。

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

終了する前に NSOperation が「フリーズ」し、キュー全体がブロックされる前に、コードで問題が発生しました。明らかに、このような状況では、私のコードは例外をスローする必要があり、現在は例外をスローしています。

しかし、操作が停止してキューをブロックし、アプリケーションが終了せず、障害が検出されないという奇妙な事態が発生するのを防ぐ必要があります。

私のごみの解決策

操作を終了するキューにタイムアウトを設定することを検討しています。その後、タイムアウトしたときに例外をスローして、問題をキャッチできます。

しかし、これは正しくありません。理想的には、作業が完了したことを確認するためにタイマーに依存したくありません。

私の質問

操作が停止していないことを確認する、フェイル セーフな方法はありますか?

4

2 に答える 2

4

わかったら…

  • オペレーションが凍結していないことを知りたい...
  • すべての操作の実行が終了することを知りたい ... になる ...
  • 停止問題を解決したい

頑張ってください。

ただし、現実的には、 で行っていることは、waitUntilAllOperationsAreFinished得られるものとほぼ同じです。各操作を監視し、実行時間が長すぎないようにする別のクラスを追加できます (たとえば、実行が予想されるよりも 10 倍長くなります-cancel) NSOperation。ただし、確認できない場所-isCancelled(システム コール内など) で操作がブロックされる可能性があるため、それでも確実ではありません。

于 2010-08-04T15:37:09.843 に答える
1

radiospiel が上記のコメントで述べているように、実際には停止問題を探しているわけではありません。操作の長さの上限と下限を適切に設定できる場合は、各操作に時間枠を与えて、操作が終了したかどうかを確認できます。適切な下限を設定できない場合、これは非効率的になります。また、操作に無限ループがある場合、環境によっては、他のスレッドが不足する可能性があります。

問題の過度に広い一般化を使用して停止問題と呼ぶことは、古典的なコンピューター サイエンスの誤りの 1 つです。一般的な問題が常に必要なわけではありません。参照: http://valgrind.org/

于 2012-06-06T04:06:43.860 に答える