sleep()适用于iOS,但不适用于mac?

sleep()适用于iOS,但不适用于mac?

问题描述:

我有一个dispatch_async调用一个辅助线程,仅用于测试目的,我想睡5秒的辅助线程。 下面是代码:sleep()适用于iOS,但不适用于mac?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    sleep(5); 
}); 

当我测试这个在Mac OSX 10.7.2狮子,睡眠()函数不把线程睡眠。在iPhone模拟器上使用相同的代码。

在mac上,sleep在主线程上工作,在辅助线程上使用[NSThread sleepUntilTimeInterval:]也可以工作。

为什么sleep()函数不能在Mac上的辅助线程上工作? 谢谢。

+0

看看[大*调度与NSThread](http://*.com/questions/5653522/grand-central-dispatch-vs-nsthread)和[有任何理由不使用睡眠在一个Grand Central Dispatch queue?](http://*.com/questions/4668634/iphone-is-it-ok-to-use-usleep-on-a-secondary-thread-on-grand-central-dispatch) – 2012-01-14 19:24:23

如果可能,全局队列在多个线程上同时运行任务。 Mac通常有4-16个内核,所以队列中有多个工作者是有道理的。最好将全局队列看作线程池。

听起来好像你可能想要查看串行队列,如果你想让队列中的任务以特定的顺序执行。

你使用任何ipc信号?

任何信号都会中断sleep(),但不是[NSThread sleepForTimeInterval:]。

+0

呼叫睡眠后()我使用互斥体不知道这是否认为是一个信号?但无论如何,相同的代码不适用于iOS – 2012-01-15 02:16:13

+0

不,互斥体不是一个信号,信号交叉进程交付。我也在想,也许你的Mac OS X环境中没有iOS环境中的东西可以使用信号,比如cputhrottle。 iOS环境在其ipc中更受控制。 这可能是一个盲区,但这是使用像NSThread sleepForTimeInterval:这样的Cocoa专用调用的原因之一,例如sleep() - 本地调用更适合运行时环境,平台Posix库。 – 2012-01-15 03:04:56

你怎么知道sleep(5)没有在iOS上执行?我在你的block中没有看到sleep()之前或之后的任何内容,表明a线程没有阻塞,并且当你对一个并发队列调度dispatch_async()时,你执行的线程(包括当前线程)确定性的设计,所以不要做任何假设。