sleep () работает с iOS, а не с mac? - PullRequest
2 голосов
/ 14 января 2012

У меня есть вызов dispatch_async для вторичного потока, и просто для целей тестирования я хотел приостановить вторичный поток на 5 секунд.Вот код:

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

Когда я проверяю это на Mac OSX Lion 10.7.2, функция sleep () не переводит поток в спящий режим.И на симуляторе iPhone, использующем тот же код, он делает это.

На Mac сна работает в основном потоке, а во вторичном потоке с помощью [NSThread sleepUntilTimeInterval:] тоже работает.

Почему победилфункция sleep () работает на вторичных потоках на mac?Спасибо.

Ответы [ 3 ]

4 голосов
/ 14 января 2012

Глобальные очереди запускают задачи одновременно в нескольких потоках, если это возможно. Маки обычно имеют 4-16 ядер, поэтому имеет смысл, что в очереди будет несколько рабочих. Глобальные очереди лучше рассматривать как пул потоков.

Звучит так, как будто вы хотите просматривать последовательные очереди, если хотите, чтобы задачи в очереди выполнялись в определенном порядке.

2 голосов
/ 15 января 2012

Используете ли вы какие-либо сигналы для IPC?

Любые сигналы будут прерывать sleep (), но не [NSThread sleepForTimeInterval:].

0 голосов
/ 15 января 2012

Откуда вы знаете, что sleep(5) не выполняется на iOS?Я не вижу ничего до или после sleep () в вашем блоке, чтобы указать, что поток a не блокировался, и когда вы dispatch_async () обращаетесь к параллельной очереди, в каком потоке вы выполняете (включая текущий)) не является детерминированным по своей структуре, поэтому не делайте никаких предположений по этому поводу.

...