2012-01-20 2 views
1

У меня есть ошибка безопасности потоков где-то в довольно большом наборе кода. Он воспроизводится как случайный сбой, просто прокручивая в моем CATiledLayer в течение нескольких секунд в симуляторе и разрешимый путем блокировки моего кода рисования в один поток (что не идеально, поскольку CATiledLayer спроектирован так, чтобы быть многопоточным, а мой рисунок код достаточно медленный, чтобы в ней нуждался).Проблема безопасности отладки нитей на iOS

Как я могу отладить проблему безопасности потоков? Я подозреваю, что где-то в моем коде лениво извлекает (и кэширует) данные, которые рисуются, но это не сильно сужает его.

Я прочитал руководство по программированию параллелизма, но не вижу ничего, что говорит об отладке, оно просто говорит о том, как структурировать ваш код.

+0

Заменить «код для ленивого извлечения (и кеширования) данных, которые рисуются», с более простым кодом, который просто закручивается на некоторое время и возвращает статическое изображение? –

+0

Данные составляют пару гигабайт векторных данных (карт). Я не могу хранить все это в ОЗУ, и он даже не поместился бы на устройстве iOS вообще, если бы это был растровый образ вместо вектора. –

+0

Ему не нужно возвращать фактические данные; это должен быть метод * simple *, который возвращает фиктивные данные (в идеале беря примерно столько же времени/процессор, сколько и возвращает «реальные» данные), чтобы увидеть, является ли это проблемой в исходном методе. –

ответ

1

Какой метод параллелизма вы используете? GCD или NSThread? И если я не могу убедить вас использовать одиночный поток для рисования, попробуйте использовать @syncronized в методах setter/getter (или атомных свойствах, если вы используете синтезированные сеттеры/геттеры).

+0

Я не знаю, какой метод параллелизма используется, но, вероятно, GCD. CATiledLayer делает все это и инструктирует меня рисовать в один фрагмент за раз на каждом физическом ядре процессора (это один фоновый поток на процессоре A4, поэтому я не обнаружил ошибку до тех пор, пока не написал тонну код). Согласно документации, все основные графики являются потокобезопасными, и насколько я знаю, весь мой код для доступа к данным также является потокобезопасным (я использую dispatch_sync, где это не так), но, очевидно, есть ошибка , Конечно, есть какой-то метод, отличный от чтения всего моего кода? Это займет несколько дней. –

+2

Ну, вы могли бы попробовать профилирование (Инструменты) и искать утечки памяти и зомби. А так как вы используете диспетчер dispatch_sync GCD, знаете ли вы, что несколько очередей могут иметь одинаковое имя? Поэтому, когда вы запускаете dispatch_sync, если вы создаете очередь в команде dispatch_sync, вы в основном создаете другой поток. Обходным решением является создание диспетчера очереди, который постоянно сохраняется во время выполнения приложения, который содержит ссылки на все предварительно созданные очереди для ваших анимаций. –

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