1

__sync_xxx_compare_and_swapGCCアトミック ビルトインでロックフリー キューを実装しました。ここで、コードが正しいことを確認したいと思います。そこで、エンキューとデキューのために複数のスレッドを開始し、次のことを試みました。

  • エンキューおよびデキュー操作の数を測定し、それらが一致するかどうかを確認します
  • 個々の要素がキューに入れられ、キューから取り出された回数を測定し、各要素の数が 2 (キューに入れられた回数とキューから取り出された回数) かどうかを確認します。

上記の 2 つの結果は正しいことがわかりましたが、エンキュー順序がデキュー順序とまったく同じであることを確認するにはどうすればよいですか? または、実装の正確性を確認する方法はありますか?

4

1 に答える 1

0

Helgrind を試してみてください: スレッドエラー検出器。ヴァルグリンドの一部です。デフォルトのオプション以外に有効にできる特別な機能については、マンページを必ずお読みください。

再注文の確認まで

  1. 異なるアイテムのみを生成する
  2. スレッドごとのログ (単一のグローバル ログファイルではなく、そのスレッド内のローカル変数!) の各スレッドの各アクション (エンキューおよびデキュー) を記録します。これは同期を必要としません
  3. 各スレッドが終了しようとしているときに、そのログをログ ファイルに保存します。

プログラムが終了すると、ログファイルでエンキューとデキューを照合できるはずです。

これは、テスト中に単一のログファイル (mutex によって保護されている)にログを記録するよりも優れています。これは、同期のボトルネック (動的なスレッドに影響を与え、テストの関連性を低下させる可能性がある) を回避できるためです。

于 2013-09-12T05:09:08.783 に答える