質問

私が作成しているアプリケーションでは、多くの場合不変の基本型を記述する必要があります。しかし、並列アプリケーションにおいて可変型と不変型をどのように比較するのか疑問に思っています。

可変オブジェクトでロックを使用できますよね?並列アプリケーションで不変型を使用して使用される他の手法と比較してどうですか?

少なくとも、不変型のロックを使用することは避けられますよね?

役に立ちましたか?

解決

種類

  • 可能な限り不変型を使用してください。
  • 可能な限り明示的なロックではなく、スレッドセーフなコレクションを使用してください。
  • 他に適切な選択肢がない場合にのみ、可変型を使用してください。

スレッド

  • 可能な限りスレッド プールを使用します。
  • スレッド プールが不可能な場合は、無限ループを使用します。
  • 最後の手段としてスレッドを手動で開始および停止します。

明示的なロックを使用する必要がある場合は、それを徹底的に文書化してください。特にオブジェクトをロックする順序に関してはそうです。Foo オブジェクトは常に Bar オブジェクトより前にロックされ、Foo(key 100) は常に Foo(key = 200) より前にロックされることがわかっている場合、デッドロックは発生しません。

他のヒント

並列化アプリケーションを作成するための鍵は、離れて変更可能な共有状態から滞在することです。スレッド間で変更可能な状態を共有することは、典型的には、ロックのいくつかのフォームを伴う同期を必要とします。不変の型を使用すると、誤ってそれが不可能なこれらのオブジェクトの状態を変更することにより、状態を共有していないことを確認することができます。しかし、これは特効薬はなく、単に設計上の選択ではありません。あなたが並列化しようとしているアルゴリズムは共有状態が必要な場合は、同期のいくつかの並べ替えを作成する必要があるとしている。

可変性は、ロックに影響を与えません。

可変型を使用すると、Write-After-Read エラーまたは Write-After-Write エラーにさらされることになります。これらは、他のスレッドが値の読み取りまたは更新を同時に行っているときに値を更新することに関連する同期エラーです。

同期エラーを防ぐには、何らかの形式のロック メカニズムを使用する必要があります。明示的ロックを使用する場合は、ロックを取得する順序に細心の注意を払う必要があります。注意しないとデッドロックが発生する可能性があります。例えば:スレッド A がロック X を取得し、次にスレッド B がロック Y を取得します。しばらくして、スレッド A がロック Y を要求し、スレッド B がロック X を要求します。これにより、両方のスレッドが解放されることのないロックを無期限に待機することになります。

ロックに関する 2 つの良い経験則:

  • 特定の順序でロックを取得します (例:常にロック Y の前にロック X を取得します)
  • ロックを保持する時間はできるだけ短くしてください。必要なときに取得し、使い終わったらすぐに解放します。

オブジェクトの作成後にオブジェクトに書き込むことがない場合は、アクセスする前にオブジェクトをロックする必要はありません。したがって、不変オブジェクトをロックする必要はありません。

ときにすることができ不変の型を使用してください。あなたは(直列化など)に持っていたときに変更可能なタイプを使用します。

すべての並列化のための

使用System.Threading.Tasks - タスクも非同期C#5言語で構築し、キーワードを待つことになる追加されます。

私はC#で可変/不変の種類についての記事を書いた:<のhref = "http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-immutable-in-a-parallel-world/ "REL =" nofollowを "> http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-immutable-in-a-parallel-world/ の

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top