私は排他的にマルチスレッドの高性能な世界で開発していますので、ここでは私が使用している一般的な習慣です。最高の最適化設計 -
は、より良いアルゴリズムです:
1)論理的に分離粉々にあなたの機能を分割します。これは、コールが「A」と「A」のみを実行することを意味します。つまり、AではなくBからCになります。
2)副次的な影響なし:すべてのネイキッドなグローバル変数を静的にまたは無しに廃止します。副作用を完全に取り除くことができない場合は、いくつかの場所に分離してください(コードに集中させてください)。
3)できるだけ多くの絶縁部品を再投入してください。これは、ステートレスであることを意味します。すべての入力を定数として受け取り、論理的に定数の宣言されたパラメータを操作して出力を生成します。可能な限り、参照の代わりに値渡し。
4)状態がある場合は、ステートレスサブアセンブリと実際の状態マシンを明確に分離します。理想的には、ステートマシンはステートレスコンポーネントを操作する単一の関数またはクラスになります。
デバッグ:
スレッディングバグが2つの幅広いflavors-競合やデッドロックに来る傾向にあります。原則として、デッドロックははるかに決定的です。
1)データが破損していますか?:YES =>おそらくレース。
2)毎回実行するか、いくつかの実行でバグが発生しますか?はい=>デッドロックの可能性があります(レースは一般的には非決定論的です)。
3)プロセスがハングアップしていますか?はい=>どこかにデッドロックがあります。時にはハングアップするだけの場合は、おそらくレースもあるでしょう。
ブレイクポイントは、論理的には類似しているため、コード内のTHEMSELVESと同じように動作することがよくあります。他のコンテキスト(あなた)が再開する信号を送信するまで、現在のコンテキストで実行を停止させます。つまり、コード内にブレークポイントを表示し、そのスレッドの振る舞いを変更する必要があります。ブレークポイントは競合状態に影響しますが、(一般的には)デッドロックは影響を受けません。
これは、すべてのブレークポイントを削除し、バグの種類を特定し、次に再導入して修正することを意味します。それ以外の場合は、単に物事をさらに歪ませます。
+1これはたくさんの「AHA」を持つ素晴らしい質問だと思う - 潜在的 – tr9sh