2012-12-09 36 views
0

很久以後我又回到C++了,我想用樣式來做,所以我潛伏在libCinder中,開始做我之前很少做的事情(和即使那時我也因爲很多原因而喜歡Qt)。這個計劃會出什麼問題?隨機EXC_BAD_ACCESS由於我一定忽略了一些東西

事情就是這樣,特別是當我使用調試配置文件和多個安全帶綁在一起(又名調試器)從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++ - 福(或缺乏),所以如果你們可以發現一些我忽略的東西,我會非常感激(因爲我不想去加工,它會覺得要去bac k到幼兒園:)

編輯:我剛想到STL可能不是線程安全的,所以同步或製作本地副本應該可能解決?

+2

STL確實不是線程安全的。如果你想使用多線程的容器,你需要提供同步。 – ymett

回答

1

出於效率原因,SDL不提供內置的同步/互斥功能。在地圖上添加互斥量可以解決問題。

+0

謝謝,我會嘗試。我還會看到,如果製作本地副本將在性能方面是可行的。 – Morpheu5

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

+0

謝謝,確實非常有幫助!本地拷貝導致我應用程序的性能下降,所以我會在下次嘗試。 – Morpheu5

相關問題