【问题标题】:NSThread setStackSize not setting the size of threadNSThread setStackSize 没有设置线程的大小
【发布时间】:2012-06-28 13:47:38
【问题描述】:

我正在使用NSThread 并为其设置堆栈大小,如下所示:

thread=[[NSThread alloc]initWithTarget:self selector:@selector(fibnocciForLoop) object:nil];
[thread setStackSize:12];
[thread start];    

-[NSThread setStackSize:] 编写的 Apple 文档:

讨论
您必须在启动线程之前调用此方法。在线程启动后设置堆栈大小会改变属性大小(由 stackSize 方法反映),但不会影响实际为线程预留的页数。

但是当我稍后在调试器中检查堆栈大小时,我没有得到我设置的值:

print (int)[thread stackSize]
$1 = 524288

我的问题是,如果 setStackSize: 方法什么都不做,为什么它还存在?

请让我知道我哪里错了,或者setStackSize: 的 API 是否没有任何用处?

编辑: 关于这个问题,请参阅@Josh Caswell 的回答,我错过了 4K 中的 K,因此上面的代码可以正常工作,如下所示:

  thread=[[NSThread alloc]initWithTarget:self
  selector:@selector(fibnocciForLoop) object:nil];
  [thread setStackSize:12*4096];//4K=4096
  [thread start];

这个问题的扩展:

有人可以解释一下为什么 Apple 提供了这个方法 setStackSize,以及如何以及何时使用这个特定的方法,因为它需要用户进行大量计算才能计算出将使用多少字节。

我想知道它在 NSThread 中的确切用途?

谢谢!

【问题讨论】:

    标签: objective-c cocoa-touch nsthread stack-size


    【解决方案1】:

    setStackSize: documentation 还说:

    接收者的堆栈大小。此值必须以字节为单位,并且是 4KB 的倍数。

    12 不是 4K 的倍数,因此您的 NSThread 会忽略您的设置并可能使用其默认值,这似乎是 128 页(iOS(和 OS X)上的页面为 4KB)或 4 MB。

    不清楚您希望 12 表示什么,但如果您希望 NSThread 使用您的设置,则需要将其更改为指示至少 4096 个字节。

    【讨论】:

      【解决方案2】:

      仅通过阅读您链接的文档,您是否尝试过调用 [setStackSize:12] [start] 之后?

      thread=[[NSThread alloc]initWithTarget:self selector:@selector(fibnocciForLoop) object:nil];
      [thread start]; 
      [thread setStackSize:4096]; // multiple of 4KB
      

      编辑:好的,没关系。我完全错误地阅读了文档。不要这样做。

      【讨论】:

      • 文档很清楚地说(OP 是正确的)——并且在两个地方——setStackSize: 必须在之前调用 start
      猜你喜欢
      • 2014-04-30
      • 2015-11-11
      • 2013-04-14
      • 2014-09-21
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多