2012-01-14 42 views
2

2次スレッドへのdispatch_async呼び出しがあります。テスト目的のために、5秒間2次スレッドをスリープ状態にしたかったのです。 ここのコードです:私は、Mac OSXライオン10.7.2上でこれをテストする場合sleep()はiOSでは動作しますが、Macでは動作しません。

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

、スリープ()関数は、スリープ状態にスレッドを入れていません。そして、同じコードを使っているiPhoneシミュレータではそうです。

Macでは、スリープはメインスレッドで機能し、[NSThread sleepUntilTimeInterval:]を使用するセカンダリスレッドでも機能します。

なぜsleep()関数がmacのセカンダリスレッドで動作しないのですか? ありがとうございます。

+0

[グランドセントラルディスパッチとNSThread](http://stackoverflow.com/questions/5653522/grand-central-dispatch-vs-nsthread)と[睡眠を使用しない理由はありますか?グランドセントラルディスパッチキュー?](http://stackoverflow.com/questions/4668634/iphone-is-it-ok-to-use-usleep-on-a-secondary-thread-on-grandcentral-dispatch) –

答えて

4

グローバルキューは、可能であれば、複数のスレッドで同時にタスクを実行します。 Macは通常4〜16コアを持つので、キューには複数の作業者がいることは意味があります。グローバルキューはスレッドプールと考える方がよいでしょう。

キュー内のタスクを特定の順序で実行したい場合は、シリアルキューを調べることができます。

2

ipcに信号を使用していますか?

すべてのシグナルはsleep()を中断しますが、[NSThread sleepForTimeInterval:]は中断しません。

+0

sleep()への呼び出しの後、私はミューテックスを使用しています。しかし、とにかく同じコードがIOSのために働いています –

+0

いいえ、ミューテックスはシグナルではなく、シグナルはプロセス間で渡されます。あなたのMac OS X環境で、iOS環境に存在しないものが、cputhrottleのような信号を使用する可能性があると考えていました。 iOS環境はipcで少しだけ制御されています。 これは盲目的なものかもしれませんが、これはsleep()のようなPosix呼び出しで[NSThread sleepForTimeInterval:]のようなCocoa固有の呼び出しを使用する理由の1つです。ネイティブ呼び出しは、プラットフォームPosixライブラリ。 –

0

sleep(5)がiOSで実行されていないことをどのように知っていますか? スレッドがブロックされなかったことを示すためにブロック内のsleep()の前後に何も表示されません。同時実行キューに対してdispatch_async()を実行すると、設計上の決定的なものなので、それについては想定しないでください。

関連する問題