2013-04-21 1 views
0

Я ищу способ убедиться, что некоторые строки кода всегда выполняются вместе (до того, как система может переключить поток).iOS Thread safety - Завершите блок кода перед переключением нитей

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

Как это можно достичь?

EDIT: Один случай использования может состоять в том, что я воспроизвожу файл midi. События автоматически выходят из потока с высоким приоритетом. При прохождении отдельных событий игрок может быть остановлен пользователем. Я хочу убедиться, что одна заметка обрабатывается полностью или что плеер остановлен раньше, и заметки не исчезают.

+0

Если у вас есть несколько «частей кода», которые блокируют друг друга, моя первая попытка состоит в том, чтобы каждый из них был в блоке @synchronize. Что не так с этим подходом? –

+0

Можете ли вы уточнить? Понятие «до того, как система может переключить поток», не имеет смысла, поскольку сама идея потоков заключается в том, что они работают одновременно друг с другом (поэтому вы используете @synchronized (или другие блокирующие механизмы) или выделенные последовательные очереди для control [synchronization] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1) общих ресурсов Ваш вопрос может быть более ясным, если вы были менее абстрактны и вместо этого описывали именно то, что вы пытаетесь сделать. – Rob

+0

Я добавил пример использования:) – Max

ответ

1

Невозможно до обеспечить, что ваш код не был выгружен операционной системой. У вас есть два варианта, чтобы ограничить возможность этого:

  1. Запустите код в потоке с высоким приоритетом. dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH); вернет такую ​​очередь. Код в этой очереди будет запускаться до кода в любой другой очереди с более низким приоритетом. Вы все равно можете получить вытеснение, хотя это менее вероятно.

  2. Использование блокировок, семафоров, @synchrosized или, как было предложено @Rob, выделенной последовательной диспетчерской очередью для сериализации доступа к разделу критического кода. Таким образом, ни один другой поток не сможет запустить этот фрагмент кода до тех пор, пока не будет выполнен другой поток. При правильном использовании это гарантирует, что раздел кода не будет выполняться двумя потоками одновременно.

Возможно, вы можете сообщить нам немного больше о вашей проблеме? Возможно, с некоторым примером кода?

 Смежные вопросы

  • Нет связанных вопросов^_^