【问题标题】:Thread Blocking Objective C线程阻塞目标 C
【发布时间】:2012-06-16 13:07:57
【问题描述】:

我刚刚阅读了this answer(答案已被删除),我确信我已经看到应用程序在挂起后崩溃,所以我读到的内容是有道理的。

如果你阻塞主线程太久,操作系统会杀死你的应用程序。


但是我写了一些测试,发现在每个测试等待大约 2-5 分钟后,它们都没有导致应用程序崩溃。断点确认我正在主线程上运行。

  • 有人可以确认或反驳我读到的内容,还是我刚刚选择了很多非阻塞选项?

  • 如果我选择了非阻塞选项,有人可以解释为什么这些是非阻塞的吗?


while (true) { /*Nothing*/ }

while (true) { NSLog(@"nothing"); }

for(;;);

sleep(100000000);

while(true) { sleep(1); }

【问题讨论】:

  • 编辑器:这些行是为了表示单独的测试。代码不应该组合在一起

标签: ios objective-c c multithreading multitasking


【解决方案1】:

您所指的答案不正确,崩溃是因为他的内存不足,而不是因为他阻塞了主线程。我相信你给出的例子都没有阻塞线程。真正阻塞线程的方法是使用递归,或者从主线程调用dispatch_sync,主队列作为参数。这会造成死锁,但我认为您的应用程序不会因此而终止(尽管我可能是错的)。

那么为什么这些是非阻塞的?取决于您如何定义阻塞。除了第 4 行之外,您提供的所有示例都只会阻止您的代码进入下一行,这完全可以。 sleep(10000000) 甚至比这更弱,因为它会在给定的秒数后正确返回,那为什么会造成任何麻烦呢?

【讨论】:

  • 是的,我写了这个问题的另一个答案。但有趣的是我并没有阻止
  • 他们确实阻止了线程继续进行。从线程不可执行的意义上说,并非所有这些都阻塞,尽管睡眠确实如此。其中一些会因为永远忙循环而阻塞。
【解决方案2】:

只有在 UIApplicationDelegate 方法(如 application:didFinishLaunchingWithOptions:applicationDidEnterBackground:)中花费太长时间时,iOS 才会终止您的应用程序。您通常有 5 秒的时间返回,尽管这对于您的应用程序的调试版本不是强制的。

在这些方法之外阻塞主线程不会导致您的应用程序被终止。

【讨论】:

  • 谢谢。我写的代码是阻塞的吗?另一个答案似乎表明没有。
  • 这取决于你所说的阻塞是什么意思。当您发布的每一行都由一个线程执行时,该线程将卡在那里而无法继续前进。尽管从技术上讲,sleep(100000000); 行将在 1157 天后返回。
  • 那我还有一些事情要做!感谢您的澄清。
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2016-01-27
相关资源
最近更新 更多