2012-01-14 181 views
2

我有一個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://stackoverflow.com/questions/5653522/grand-central-dispatch-vs-nsthread)和[有任何理由不使用睡眠在一個Grand Central Dispatch queue?](http://stackoverflow.com/questions/4668634/iphone-is-it-ok-to-use-usleep-on-a-secondary-thread-on-grand-central-dispatch) – 2012-01-14 19:24:23

回答

4

如果可能,全局隊列在多個線程上同時運行任務。 Mac通常有4-16個內核,所以隊列中有多個工作者是有道理的。最好將全局隊列看作線程池。

聽起來好像你可能想要查看串行隊列,如果你想讓隊列中的任務以特定的順序執行。

2

你使用任何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

0

你怎麼知道sleep(5)沒有在iOS上執行?我在你的block中沒有看到sleep()之前或之後的任何內容,表明a線程沒有阻塞,並且當你對一個併發隊列調度dispatch_async()時,你執行的線程(包括當前線程)確定性的設計,所以不要做任何假設。

相關問題