POSIX потоки на IOS - PullRequest
       1

POSIX потоки на IOS

1 голос
/ 22 сентября 2011

Я начал экспериментировать с потоками POSix на платформе ios.При использовании NSThread это довольно сложно.

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

Я думаю, что у меня есть основы, но я хотел бы получить профессиональное мнение, прежде чем я попытаюсь перейти к более сложным вещам.Кажется ли то, что у меня здесь, «хорошо», и не могли бы вы указать на что-нибудь, что могло бы вызвать проблемы?Можете ли вы обнаружить какие-либо проблемы с управлением памятью и т. Д.

1008 *

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Одна потенциальная проблема - как создается хранилище для переданной в структуре mystruct.Время жизни этой переменной очень важно для ее использования в потоке.Например, если вызывающий detachnewthread объявил это в стеке, а затем возвратил до завершения потока, это было бы неопределенным поведением.Аналогично, если он был выделен динамически, то необходимо убедиться, что он не освобожден до завершения потока.

В ответ на комментарий / вопрос: Необходимость какого-либо мьютекса зависит от использования.Ради обсуждения, я буду предполагать, что это распределяется динамически.Если вызывающий поток заполняет содержимое структуры до создания «дочернего» потока и может гарантировать, что он не будет освобожден до тех пор, пока дочерний поток не выйдет, а последующий доступ только для чтения, то вам не понадобитсямьютекс, чтобы защитить его.Я могу представить себе сценарий такого типа, если структура содержит информацию, которая нужна дочернему потоку для выполнения своей задачи.

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

1 голос
/ 22 сентября 2011

Попробуйте использовать Apple Central Central Dispatch (GCD), которая будет управлять потоками для вас.GCD предоставляет возможность распределять работу через блоки в различные очереди, управляемые системой.Некоторые из типов очереди являются параллельными, последовательными и, конечно, основной очередью, в которой работает пользовательский интерфейс.На основе имеющихся ресурсов ЦП система будет управлять очередями и необходимыми потоками для выполнения работы.Простой пример, который показывает, как вы можете вкладывать вызовы в разные очереди, выглядит следующим образом:

__block MYClass *blockSelf=self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [blockSelf doSomeWork];
    dispatch_async(dispatch_get_main_queue(), ^{
        [blockSelf.textField setStringValue:@"Some work is done, updating UI"];
    });
});

__ block MyClass * blockSelf = self используется просто для того, чтобы избежать циклов сохранения, связанных с работой блоков.

Документы Apple: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

Q & A блог Майка Эша: http://mikeash.com/pyblog/friday-qa-2009-08-28-intro-to-grand-central-dispatch-part-i-basics-and-dispatch-queues.html

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