0

很长一段时间后我又回到了 C++,我想用风格来做这件事,所以我一头扎进了 libCinder 并开始做我以前很少做的事情(即使那时我还是因为一些原因更喜欢 Qt )。这个计划有什么问题?

问题是很少这样做,尤其是当我使用调试配置文件从 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++-fu(或缺乏)出了点问题,所以如果你们能发现我忽略的东西,我将非常感激(因为我不想去处理,它会感觉要回幼儿园了:)

编辑:我突然想到 STL 可能不是线程安全的,所以同步或制作本地副本应该可以解决吗?

4

2 回答 2

1

出于效率原因,SDL 不提供内置同步/互斥。在地图周围添加互斥锁应该可以解决问题。

于 2012-12-16T18:50:35.327 回答
0

正如@alexp 所指出的,不支持从多个线程同时读取和写入 STL 容器。

但是,如果您关注 Anthony Williams 的优秀文章,您可以让您的生活更轻松: 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

于 2013-05-06T15:29:12.453 回答