単体テストは、正しい使用方法ではなく、上記の関数の正しい実装をテストしている場合にのみ役立ちます。単体テストでは、コードベースの残りの部分にある別のスレッドから関数が呼び出されないことはできないためです。 t前提条件に違反するパラメーターを指定して関数を呼び出すことはできないと言います(技術的には、テストしようとしているのは、基本的に使用法の前提条件の違反です。これは、テストを行うことができないため、効果的にテストすることはできません。 tコードベースの他の場所がそのような関数をどのように使用するかを制限します;ただし、前提条件の違反が適切なエラー/例外になるかどうかをテストできます)。
これは、他の人が指摘しているように、関連する関数自体の実装における私にとっての主張のケースです。あるいは、関数がスレッドセーフであることを確認することはさらに洗練されています(ただし、一部のAPIを操作する場合、これは必ずしも実用的ではありません)。
また、余談ですが、すべてのケースで「メインスレッド」!=「UIスレッド」です。多くのGUI APIはスレッドセーフではありません(そして、スレッドセーフGUIキットを作成するのは難しいです)が、それは、アプリケーションのエントリポイントがあるスレッドと同じスレッドからそれらを呼び出す必要があるという意味ではありません。これは、関連するUI関数内にアサーションを実装して「UIスレッド」と「メインスレッド」を区別する場合にも役立ちます。たとえば、アプリケーションのメインエントリポイント(ではなく、少なくとも、実装が本当に関連するものにのみ適用している仮定/使用制限の量を減らします。
スレッドセーフティは、実際には以前の私のチームの「問題」の原因であり、私たちの特定のケースでは、スレッドセーフの中で最も逆効果的な「マイクロ最適化」というラベルを付け、すべての種類のメンテナンスコストよりも多くのメンテナンスコストをかけました。手書きのアセンブリ。単体テストではかなり包括的なコードカバレッジがあり、かなり洗練された統合テストがありましたが、テストを回避したソフトウェアでデッドロックと競合状態に遭遇しました。そしてそれは、開発者が関数呼び出しのチェーンで発生する可能性のあるすべての副作用を認識せずに、無計画にマルチスレッド化されたコードであり、投げるだけで後からそのようなバグを修正できるというかなり単純な考えがあるためです左右にロックし、
マルチスレッディングを信用していない古い学校のタイプとは逆の方向に歪んでいて、それを採用するのは本当に遅れており、正しさがパフォーマンスを打ち負かして、今あるすべてのコアをめったに使用しないようにしました。純粋な関数、不変のデザイン、永続的なデータ構造のように、レース状態やデッドロックを心配することなく、ハードウェアを完全に活用することができました。2010年くらいまでずっと、私はマルチスレッド化を嫌っていましたが、スレッドセーフの理由から取るに足らない領域でのいくつかの並列ループを除いて、情熱を持って熱意を持っていました。以前のチームでマルチスレッディングに悩まされた製品。
私にとって、最初にマルチスレッド化し、後でバグを修正する方法は、最初からマルチスレッド化を嫌いになるほどにマルチスレッド化する恐ろしい戦略です。設計が確実なスレッドセーフであり、それらの実装が同様の保証のある関数(例:純粋な関数)のみを使用することを確認するか、マルチスレッドを回避します。それは少し独断的に出くわすかもしれませんが、それはテストを回避する後知恵の中で再現するのが難しい問題を発見する(またはさらに悪いことに、発見しない)よりも優れています。ロケットエンジンを最適化しても、宇宙への旅の途中で予期せず突然爆発しやすくなる場合は、意味がありません。
スレッドセーフではないコードを使用せざるを得ない場合は、ユニット/統合テストでそれほど解決する必要のある問題だとは思いません。アクセスを制限することが理想的です。GUIコードがビジネスロジックから分離されている場合、それを作成するスレッド/オブジェクト以外からのそのような呼び出しへのアクセスを制限する設計を実施できる可能性があります*。これは、私にとって理想的な遠いモードです。他のスレッドがこれらの関数を呼び出せないようにするのではなく、それらを呼び出せないようにすることです。
- はい、私は、コンパイラーがあなたを保護することができないところで、通常あなたが強制するどんなデザイン制限の周りにも常に方法があることを理解しています。私は実際に話しているだけです。「GUIスレッド」オブジェクトなどを抽象化できる場合、GUIオブジェクト/関数にパラメーターを渡すのはそれだけであり、そのオブジェクトが他のスレッドにアクセスできないように制限することができます。もちろん、それを迂回して深く掘り下げて、そのようなフープを回避して上記のGUI関数/オブジェクトを他のスレッドに渡して呼び出すことができるかもしれませんが、少なくともそこには障壁があり、それを実行する誰にでも「ばか「そして、少なくとも、設計が明らかに制限しようとしていたものの抜け穴を明確に迂回して探すために、間違っているわけではありません。:-Dそれは