2016-07-27 2 views
1

私はマルチスレッドアプリケーションで作業していましたが、複数のスレッドによって使用され変更されているリストを処理するための最も効果的な方法をまだ試しています。マルチスレッドアプリケーションとスレッドセーフリスト

私は、ListのThreadsafeクラスを書くことは本当に最良の選択肢ではないことを知りました。正直言って、ロックはやや乱雑です。

私はこれをConcurrentDictionaryに変換しようと考えていましたが、これは本当にうまく動作するようです。

しかし、私は別のアプローチを試みたし、それは奪うオプションだかない場合は、この上でいくつかの意見を聞きたい:

if(MyList.Count > 0) 
{ 
    MyStruct[] Example = null; 
    Example = new MyStruct[MyList.Count]; 
    MyList.CopyTo(Example, 0); 

    foreach(MyStruct B in Example) 
     //Code here 
} 

これは私が仕事にしようとしたように見えただけで何かであります実際に他の場所に変更を加える必要はありません。私もこれを行う必要があるかどうか分からないので、これについていくつかの意見を探しているのです

答えて

1

いいえ、これはスレッドセーフではありません。

簡潔にするために2つのスレッドを考えてみましょう。

  1. スレッドAは、スレッドBがリスト10個の項目があり、10項目
  2. スレッドAのための配列リストにアイテムを追加し、それは現在11を有して作成さ見10件の商品
  3. 付きリストを作成しますアイテム
  4. CopyToの上のスレッドBがクラッシュし、アレイが

十分な大きさではありませんそして、それが起こることができるsanestものの一つだから。

ランダムにマルチスレッドを混乱させないでください。それは乱雑で危険です。あなたは再現して修正するのが難しいバグをたくさん残します。何かが明示的にスレッドセーフであると言われない限り、スレッドセーフを仮定しないでください。マルチスレッドでの必須スターター:http://www.albahari.com/threading/

通常のチェックリストは、このようなものになる:

  1. は、最初の場所でマルチスレッドを持っている、それは本当に必要ですか?
  2. は確実ですか?
  3. 必要なだけのスレッドセーフなクラスはありますか?
  4. デッドロックが発生しないことが保証されたシンプルで一貫したロックアーキテクチャを使用できますか?
  5. 本当にあなたは複数のスレッド間でそのオブジェクトを共有する必要がありますか?
  6. 真剣に、マルチスレッドは難しいです。スレッド間で明示的に渡される変更可能な状態ではなく、不変のデータを使用することができますか?
  7. スレッド間の同期を処理する最も簡単な方法を見つけてください。
  8. 十分ですか?いいよ、止めろ。
  9. 十分ではありませんか?データ共有の代替アプローチを検討してください。
  10. まだ共有リソースにボトルネックがある場合は、ロックレスプログラミングを検討してください。 これは、ロックベースの同期よりはるかに困難です。あなたがしていることを知っていることを確認してください。 C#/ .NETを設計した人さえ、ロックフリーのプログラミングには非常に注意しています。 Raymond Chenも、ソフトウェア工学のChuck Norrisです。ライオンがいる。保証されているものと保証されていないもの、お客様のプラットフォームで安全なもの、すべてのプラットフォーム共通のものを完全に理解する必要があります。
+0

私は特にポイント10とコメントがあります "ライオンズがあります"。 – sr28

関連する問題