2011-08-11 12 views
1

このコードは例外をスローできますか?これはスレッドセーフなコードですか?

public String[] GetPorts() 
     { 
     var sourceArray = Data; 
     var array = new String[sourceArray.Count]; 
     for (int i = 0; i < array.Length; i++) 
     { 
      array[i] = Data[i][0]; 
     } 
     return array; 
} 

データを使用すると、配列にアクセスするとそれは(あなたが追加/変更項目の配列を変更することはできません)

+0

データはどこに定義されていますか? – sternr

+0

コンテキストとは何ですか? – ChrisF

+0

あなたのオブジェクトのどれが別のスレッドからアクセスできるのですか? – Vlad

答えて

2

Data可能であれば読み取り専用のみの操作に限り、スレッドセーフですList<String[3]>

+0

私の投稿を更新します – Mediator

+0

私の回答も更新しました – Vlad

0

です別のスレッドから変更するには、問題があります。たとえば、反復中にDataのサイズが変更される可能性がある場合は、IndexOutOfBoundExceptionが返されます。また、Dataは、同時読み書きをサポートしていない可能性があります。 (あなたが提示したコードで他のスレッドと同時に読むことができます)

mutexでDataを保護しなければなりません。

データタイプがDataであることが分かっていれば、さらに詳しい情報を得ることができます。


MSDNによると、List<T>は同時リーダーとライターをサポートしていません。したがって、他のコードが書き込める場合は、Dataを保護する必要があります。

1

スレッドセーフはすべて共有リソースに関するものです。 指定したコードスニペットでは、唯一可能な共有リソースはData です.1つのスレッドからデータにアクセスでき、それらの次元を変更できる場合は、noよりもコードがスレッドセーフではありません。それ以外の場合 - それは

0

アレイをコピーするかどうかによって異なります。この場合、他のスレッドがDataからアイテムを削除すると問題が発生する可能性があるため、キャッシュされたループの制限array.Lengthの値は間違っていますこれにより、IndexOutOfBoundExceptionが返される可能性があります。Data[i][0]

0

あなたが入力した詳細を考えれば、このコードはスレッドセーフではなく、はい、例外をスローすることができます。データ変数はここでは不明なキーです。他のスレッドがアクセスできる場合は、このメソッドでさまざまな予期しない動作が発生する可能性があります。