我很长一段时间回到C ++,我想用风格做到这一点,所以我先面对头进入libCinder并开始做我以前很少做过的事情(甚至那时我曾经更喜欢Qt for a原因数量)。这个计划可能出现什么问题?
事情很少,特别是当我使用Debug配置文件从Xcode内部运行我的代码并绑上几个安全带(也就是调试器)时,但是我必须进入疯狂和令人讨厌的事情:用户太兴奋了,事情不够紧张,最终我的应用程序惨不忍睹。
我设法将罪魁祸首缩小到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 :(得分:1)
出于效率原因,SDL不提供内置同步/互斥。在地图周围添加互斥锁可以解决问题。
答案 1 :(得分:0)
正如@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