0

プログラムで 2 つのスレッドを実行しています。これらは boost::thread を使用して作成されます。

2 つのスレッドは、メモリに関して何も共有しません。それらの間でデータ構造やオブジェクトが共有されることはありません。

ここで、2 番目のスレッドはプライベート メンバーとして多くの二重固有行列を持つクラスを使用します。Eigen ディレクティブ EIGEN_MAKE_ALIGNED_OPERATOR_NEW などを使用して行列が整列されていることを確認します

最初のスレッドが実行されているとき、2 番目のクラスの行列の要素は上書きされます。小数のはずの要素がいきなり整数になってしまうので調べてみました。最初のスレッドが実行されていない場合、2 番目のスレッドには問題がなく、その Eigen メンバーは正しい値を持っています。

繰り返しますが、1) 2 つのスレッドはデータ構造を共有していません。2) プログラムの実行中に、セグメンテーション違反メッセージまたは同様のメッセージまたはエラー メッセージが表示されない。3) 2 番目のスレッドのメモリを保護する方法、またはメモリがどのように侵害されたかを追跡する方法について何か提案はありますか?

前もって感謝します。コードを投稿しなかったことは本当に申し訳ありませんが、それは巨大です。コードから特定のものを投稿してほしい場合はお知らせください。

4

1 に答える 1

0

Mac 用の mallocguard や Linux 用の Electric Fence などのデバッグ ツールが必要になる可能性があります。

これらは、アクセスできない仮想メモリとしてマークする割り当ての前に「ガード ページ」を追加することによって機能します。メモリが解放されると、それもアクセス不能としてマークされます。プログラムが本来あるべきではないメモリにアクセスしようとすると、変更されたアロケータが即座にクラッシュすることを保証するため、デバッガは破損の原因となったコード行を強調表示することが期待されます。これは大量のメモリを消費する可能性があるため、破損を再現する小さなデータ セットが必要になる可能性があることに注意してください。

于 2012-07-18T20:06:34.503 に答える