2009-03-06 3 views
2

Hy、マルチスレッドアプリケーションの共有データの検索/回避のルール

マルチスレッドアプリケーションの開発は難しいことです。特にロックする時点と何をロックするのかはあまり明確ではありません。しばしば私はメソッド/クラスを見ているので、複数のスレッドで変更できるデータを共有している場合は、自分自身に質問しなければなりません。そして、コードブロック全体のlock()で終わるかどうかわからないとき。

私が知りたいこと:共有データを特定するためのパターンやルールなどの提案はありますか?コードがスレッドセーフであることを保証する技術。

例えば:

  • 静的メソッドは、クラスのフィールドを変更しないでください。 (フィールドをロックしない限り)
  • メソッドの参照型パラメータは、直接渡すべきではありません。常にクローンを渡す。ところで

マイクロソフトリサーチがCHESSに取り組んでいます。並行プログラムでHeisenbugを見つけて再生するためのツール。私はこれとPLINQが並行プログラムの開発を改善することを願っています。

答えて

3

可能な限り、タイプが不変で始まるようにします。その後、クローンを作成する必要はありません。オブジェクトの内容を変更する必要がある場合は、String.Replaceなどのように、新しいオブジェクトを返すようにします。

これは基本的に機能的なプログラミングスタイルであり、素敵です。 .NET Frameworkに組み込まれている不変なコレクションは(現時点では)持っていませんが、残念ながら、第三者のものはincluding one by our own JaredParです。

+0

音が面白いです。 http://codebetter.com/blogs/patricksmacchia/archive/2008/01/13/immutable-types-understand-them-and-use-them.aspxは、より多くのことを学びたい人には役立つかもしれません。 – danio

+0

+1いつもとても便利な答えです。不変の型を使用するのは非常に良いと思う。 "subquestion":C#のvar(匿名型)は不変ですが、そうではありませんか? – TomTom

+0

@TomTom:はい、匿名型自体はC#で不変です。それは必ずしもVBでのケースではありません(それは匿名型の作成方法によります)。 –

0

クラス内のデータをカプセル化すると、スレッドセーフにするときに便利です。データへのアクセス方法を制御することができ、アプリケーション全体のコードが適切に同期しようとするのではなく、クラスの同期を担当させることができます。

また、ロック識別子として使用できるプライベート変数を置く場所があるため、データ自体をロックの識別子として使用することはできません。ロック識別子としてプライベート変数を使用することにより、デッドロックの可能性のあるソースを1つ削除します。