悪いマルチスレッドのためにほぼ/実際に失敗したプロジェクトからどのような教訓を学びましたか?
フレームワークは、特定のスレッドモデルを課すことがあるため、物事を1桁正しくするのが難しくなります。
私に関しては、最後の障害からまだ回復していないため、そのフレームワークでマルチスレッドに関係することは一切しない方が良いと感じています。
私は、単純な分岐/結合があり、データが一方向にしか移動しない(信号は円形方向に移動できる)マルチスレッドの問題に長けていることがわかりました。
一部の作業は厳密にシリアル化されたスレッド(「メインスレッド」)でのみ実行でき、他の作業はメインスレッド(「ワーカースレッド」)以外のスレッドでのみ実行できるGUIを処理できません。データとメッセージは、N個のコンポーネント間で全方向に移動する必要があります(完全に接続されたグラフ)。
そのプロジェクトを別のプロジェクトに任せたとき、どこにでもデッドロックの問題がありました。2〜3か月後、他の開発者がデッドロックの問題をすべて解決し、顧客に出荷できるようになったと聞きました。不足している知識の一部を見つけることができませんでした。
プロジェクトに関する何か:メッセージID(スレッドに関係なく、別のオブジェクトのメッセージキューに送信できるイベントの意味を表す整数値)の数は数千になります。一意の文字列(ユーザーメッセージ)も約1,000になります。
追加しました
(過去または現在のプロジェクトとは無関係に)別のチームから得た最高の例えは、「データベースにデータを置く」ことでした。(「データベース」は集中化とアトミック更新を指します。)すべてが同じ「メインスレッド」で実行され、すべての非GUIヘビーリフティングが個々のワーカースレッドで実行される複数のビューに断片化されるGUIでは、アプリケーションのデータはデータベースのように動作する単一の場所に格納され、「データベース」が重要なデータ依存関係を含むすべての「アトミック更新」を処理できるようにします。GUIの他のすべての部分は、画面の描画のみを処理します。UIパーツはデータをキャッシュする可能性があり、ユーザーが適切に設計されていれば、ほんの数秒で陳腐化していることに気付かないでしょう。この「データベース」は「ドキュメント」とも呼ばれます ドキュメントビューアーキテクチャ。残念ながら、いや、私のアプリは実際にはすべてのデータをビューに保存します。なぜそうだったのか分かりません。
仲間の貢献者:
(貢献者は実際の/個人的な例を使用する必要はありません。逸話的な例からの教訓は、自分で信頼できると判断された場合も歓迎します。)