Случайный EXC_BAD_ACCESS из-за чего-то, что я должен был пропустить

Я вернулся к C ++ через некоторое время, и я хотел сделать это со стилем, поэтому я погрузился лицом к лицу с libCinder и начал делать вещи, которые раньше редко делал (и даже тогда я предпочитал Qt по ряду причин ). Что может пойти не так с этим планом?

Дело в том, что очень мало что делает, особенно когда я запускаю свой код из XCode, используя профиль Debug и с несколькими привязанными ремнями безопасности (он же отладчик), но потом мне приходится вдаваться в дикие и неприятные вещи: пользователи слишком взволнован, что-то недостаточно плотно, и в конечном итоге мое приложение ужасно падает.

Мне удалось сузить преступников до функции PilotStudyApp :: draw () (см. Код здесь https://github.com/Morpheu5/PilotStudy), скорее всего, вокруг последнего цикла for, который проходит через _activePoints, но я не могу быть уверен, как вы можете видеть из bt

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libstdc++.6.dylib               0x914635e4 std::_Rb_tree_increment(std::_Rb_tree_node_base*) + 15
1   org.cinder.PilotStudy           0x000916b3 PilotStudyApp::draw() + 419
2   org.cinder.PilotStudy           0x000c34ad -[CinderView drawRect:] + 125

что вы можете увидеть здесь полностью: http://pastebin.com/izZcFy8p

У меня есть сильное чувство, что что-то не так с моим C ++ — фу (или его отсутствием), так что если вы, ребята, заметите что-то, что я упустил, я буду чрезвычайно благодарен (так как я не хочу идти на обработку, это будет хочется вернуться в детский сад 🙂

РЕДАКТИРОВАТЬ: Мне только что пришло в голову, что STL может не быть потокобезопасным, поэтому может потребоваться разрешить синхронизацию или создание локальных копий?

0

Решение

Из соображений эффективности SDL не обеспечивает встроенную синхронизацию / взаимное исключение. Добавление мьютекса вокруг вашей карты должно решить проблему.

1

Другие решения

Как отметил @alexp, одновременное чтение и запись в контейнеры STL из нескольких потоков не поддерживается.

Однако вы можете облегчить себе жизнь, если будете следовать прекрасной статье Энтони Уильямса:
http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

Для вашего удобства я написал несколько одновременных контейнерных классов на основе его статьи, которые вы можете найти здесь:
https://github.com/paulhoux/Cinder-Samples/tree/master/FlickrImageViewer/include/ph

0