2012-01-20 12 views
1

かなり大きなコードセットのどこかにスレッドセーフティバグがあります。私のCATiledLayerを数秒間シミュレータでスクロールするだけで、ランダムなクラッシュとして再現できます。また、私の描画コードを単一のスレッドにロックすることで解決できます(CATiledLayerはマルチスレッドと私の描画であるためコードが必要なほど遅い)。iOSでのスレッドの安全性の問題のデバッグ

スレッドセーフティの問題をデバッグするにはどうすればよいですか?私はそれが描画されているデータを遅れて取得(およびキャッシュ)するのは私のコードのどこかにあると思われますが、それはあまり絞り込まれません。

私は「並列プログラミングガイド」を読み飛ばしましたが、デバッグについては何も話していませんが、コードの構造を説明しています。

+0

"描画中のデータを遅延読み込み(キャッシュ)する"コードを、単純に回転して静的なイメージを返す単純なコードに置き換えますか? –

+0

データは数ギガバイトのベクトルデータ(マップ)です。私はそれをRAMにすべて保存することはできませんし、ベクターの代わりにビットマップイメージであれば、iOSデバイスにも適合しません。 –

+0

実際のデータを返す必要はありません。ダミーデータを返す*シンプル*メソッドでなければなりません(理想的には、実際のデータを返す時間/ CPUとほぼ同じくらい時間がかかります)。 –

答えて

1

どの並行処理方法を使用していますか? GCDまたはNSThread?そして、あなたが描画のために単一のスレッドを使用するように説得できない場合は、@syncronizedをセッター/ゲッターメソッド(または合成されたセッター/ゲッターを使用する場合はアトミックプロパティ)で使用してみてください。

+0

どの並行処理方法が使用されているのかは分かりませんが、おそらくGCDです。 CATiledLayerはそのすべてをやっていて、各物理CPUコアで一度に1つのタイルに描画するように指示しています(A4 CPU上の1つのバックグラウンドスレッドです。コード)。ドキュメントによると、コアグラフィックスはすべてスレッドセーフであり、データにアクセスするためのすべてのコードがスレッドセーフであることがわかっている限り(私はdispatch_syncを使用しています)、明らかにバグがあります。確かに私のコードをすべて読む以外の方法がありますか?それは数日かかるだろう。 –

+2

さて、プロファイリング(Instruments)を試して、メモリリークやゾンビを探すことができます。 GCDのdispatch_syncを使用しているので、複数のキューに同じ名前を付けることができますか?したがって、dispatch_syncを起動すると、dispatch_sync命令内でキューを作成すると、基本的に別のスレッドが作成されます。この問題を回避するには、アプリケーションランタイム中に常に存続するキューマネージャを作成します。このキューマネージャは、事前に作成されたすべてのキューの参照をアニメーションに保持します。 –

関連する問題