Безопасность потока iOS - завершите блок кода перед переключением потока
Я ищу способ убедиться, что некоторые строки кода всегда выполняются вместе (до того, как система может переключить поток).
Насколько я знаю, @synchronized не работает для этого, так как он блокирует только другой поток для входа в этот определенный блок. В моем примере у меня есть разные части кода, которые влияют друг на друга, и я хочу убедиться, что каждая из них блокирует другую.
Как этого достичь?
РЕДАКТИРОВАТЬ: Один вариант использования может быть, что я воспроизводить MIDI-файл. События выходят в поток с высоким приоритетом автоматически. Во время обработки отдельных событий игрок может быть остановлен пользователем. Я хочу удостовериться, что либо одна нота полностью обработана, либо игрок остановлен раньше, и ноты не исчезают.
1 ответ
Нет никакого способа гарантировать, что ваш код не будет выгружен операционной системой. У вас есть два варианта, чтобы ограничить вероятность того, что это произойдет:
Запустите ваш код в потоке с высоким приоритетом.
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH);
вернет такую очередь. Код в этой очереди будет выполняться перед кодом в любой другой очереди с более низким приоритетом. Вы все еще можете получить приоритет, хотя это менее вероятно.Используйте блокировки, семафоры, @synchrosized или, как предлагает @Rob, выделенную очередь последовательной отправки для сериализации доступа к разделу критического кода. Таким образом, ни один другой поток не сможет запустить этот фрагмент кода, пока другой поток не будет завершен. При правильном использовании это гарантирует, что секция кода не будет выполняться двумя потоками одновременно.
Может быть, вы можете рассказать нам немного больше о своей проблеме? С некоторым примером кода, возможно?