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 倍),此时它会-cancelNSOperation或多或少是您的计时器方法)。但是,即使这样也不是万无一失的,因为操作可能会在您无法检查的情况下被阻止-isCancelled(例如,在系统调用内部)。

于 2010-08-04T15:37:09.843 回答
1

正如 radiospiel 在上面的评论中所说,您实际上并不是在寻找停机问题。如果您可以对操作的长度进行良好的上限和下限,您可以为每个操作设置一个时间窗口,看看它们是否已经完成。如果你不能做好下限,那么这将变得低效。此外,如果您的任何操作具有无限循环,它们仍然可以使其他线程饿死,具体取决于您所处的环境。(然后您就不走运了。)

使用过于宽泛的问题概括称它们为停机问题是经典的计算机科学错误之一。您并不总是需要一般问题。见:http: //valgrind.org/

于 2012-06-06T04:06:43.860 回答