0

競合状態が存在する場合でも、マルチスレッド プログラムを決定論的に実行できるツールを見てきました。実際にレースを検出し、(実行時に) コードを書き直して、将来レースが検出されないようにするツールがあるかどうか疑問に思います。

そのようなツールは存在しますか?それとも作成するのが難しすぎますか?PIN や valgrind など、コードを動的にバイナリ変換するツールで作成できると思います。

4

2 に答える 2

5

競合状態とは、計算の結果が発生するイベント (割り込み、スケジューラなど) のタイミングに依存することを意味します。開発者が通常意味すること(あなたも意味すると思います) は、プログラムはほとんどの場合「正しく」、まれにしか失敗しないということです。これは、まれにしか発生しない競合状態によって引き起こされるバグです。

自動化された検出アルゴリズムは、何が望ましい結果で何がそうでないかをどのように知ることになっているのでしょうか? そして、それができたとしても、それが起こったことを知り、その方法を理解し、それを修正することは、通常、はるかに困難です. この問題を停止問題に還元できると確信しています。

仕事では、競合状態を検出するための単体テストを作成できるいくつかのフレームワークをいじりました (私が仕事に戻ったときに、それが何と呼ばれるかを見ることができます) が、それは可能なすべてのスレッド スケジュールを列挙することに基づいています。簡単なテストとして、並行キューの実装で実行させました。1 つのコンシューマーと 1 つのプロデューサー、およびキュー容量 1 のテスト ケースの実行には数秒かかりました。キュー容量を 2 に増やすだけで、数日間実行できました。ツールがあまり良くなかったのかもしれませんが、可能な組み合わせの数が非常に速く爆発することを示しています.

于 2012-06-04T10:17:36.347 に答える
2

決定論的な方法でプログラムを実行することは質問するには多すぎますが、一部の(すべてではないにしても)競合状態を検出することは難しくありません。

現在、この分野で多くの研究が行われています。そして、あなたは正しい軌道に乗っています

PIN -------> Intel Parallel Studio Valgrind-> Cachegrind and ThreadSanitizer 1.0

多くのオープンソースおよび商用ツールがあります。私は1に取り組んでいました

このようなツールが機能する方法は、メモリアクセスごとにロックやその他の情報を追跡し、以前のアクセスの履歴を維持することです。すべてのアクセスは、以前のアクセスの履歴と比較されます。それだけではありません。

于 2012-06-10T06:59:12.167 に答える