ほとんどの問題については (まだ!) お手伝いできませんが、当社のC++ テスト カバレッジツールを使用すると、マルチスレッド テスト カバレッジ データを非常に簡単に提供できると思います。
このツールは、ソース コードを計測します。それをコンパイルして実行します。さまざまなブロックを表すコードに (安価な) インストルメンテーション プローブが作成されます。インストルメンテーションは、プログラムのどの部分が実行されるかを記録します。名目上は、インストルメンテーション プローブごとに 1 ビットのビット ベクトルとして記録されます。実行の最後に (またはいつでも)、このビット ベクトルはダンプされ、ビューアーはそれをコードに重ねて表示します。
マルチスレッド テスト カバレッジを取得する秘訣は、インストゥルメント プローブの動作の定義を完全に制御できることを知っておくことです。それらはマクロです。したがって、本質的にデフォルトのマクロを使用するのではなく、
probe[n]=true;
ブール配列では、代わりに実装できます
probe[n]|=1<<threadid;
int 配列 (または、この値を事前計算することで巧妙に安価なもの) で。これを実装するには、おそらく数行のコードしか必要ありません。
人々は、これには技術的に同期の問題があることに気付くかもしれません。それは本当ですが、せいぜい少しのカバレッジ データが失われるだけであり、その可能性はかなり高くなります。ほとんどの人は、完璧ではなく「かなり良い」データに満足しています。完璧を求めると、アトミックな更新命令を使用して高い同期代価を支払うことになります。
また、プローブ ダンプ ロジックを制御することもできます。これを修正して、スレッド固有のカバレッジ データを書き出すことができます (数十行のカスタム コード範囲)。テスト カバレッジ データ ビューアでは、スレッド固有のカバレッジを確認できます (適切なカバレッジ ベクトルを選択するだけです)。また、カバレッジ ベクトルの交差/結合/差分を簡単に計算/表示するための機能が組み込まれているため、スレッドごとのカバレッジの関係が正確に得られます。