Ждите NSThread - PullRequest
       2

Ждите NSThread

0 голосов
/ 30 января 2011

У меня много NSThreads, и я хочу спать в то время, когда они работают. Как мне это сделать? Есть ли в iOS SDK аналог функций WinApi WaitForSingleObject / WaitForMultipleObjects?

Ответы [ 2 ]

6 голосов
/ 31 января 2011

Существует довольно много способов, но я бы предложил использовать libdispatch.

Вместо порождения NSThreads:

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    /* work to do in a thread goes here */
});
/* repeat for other threads */
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); //wait for all the async tasks in the group to complete

См. http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_group_async.3.html для документации.

Альтернативой может быть использование семафора, posix или dispatch (http://www.csc.villanova.edu/~mdamian/threads/posixsem.html имеет некоторую информацию, как и http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html).

(отредактировано для добавления еще одной альтернативы):

Это также будет хорошо работать, если все ваши потоки выполняют по существу одну и ту же работу (т. Е. Разбивает задачу, а не выполняет кучу разных задач), и намного проще:

dispatch_apply(count, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i){
 doWork(someData, i);
});
0 голосов
/ 31 января 2011

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

В iOS используется только одно ядро, а пропускная способность шины чрезвычайно ограничена.

Было бы гораздо лучше использовать инструменты параллелизма, предоставляемые системой более высокого уровня (NSOperation, dispatch и любой из асинхронных API), где это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...