2017-12-05 3 views
-3

私はbool Method(Myobject Obj)という特定のメソッドを1つ持っており、私は彼がParallelFor()ループにいる間に電話したいと思っています。実際にそれを行うことはできますか?これはスレッドセーフなものなのでしょうか?このようなメソッドを呼び出すのは間違っているように感じます。ParallelForでの呼び出し方法

+5

もちろんこれを行うことができます。スレッドセーフであるかどうかは、メソッドが何をするかによって異なります。 –

+2

試しましたか?あなたのコードを共有できますか? '方法'はやりましたか? – Icepickle

+0

@Icepickleいいえ、私はまだテストしようとしていませんが、オブジェクト 'Obj'が他の' Obj'と並行プロセスかそれに類似したものと "ミックス"できるかどうかを知りたかっただけです。私は、この 'Method'の中ではスレッドが交差しているのではなく、' Obj'の処理しかしていないと言います。 – BlauWave

答えて

2

スレッドの安全性は、常にコンテキストまたは特定のケースに基づいて決定されます。 は、あなたがこれを持っていること、のは、言ってみましょう:

public static bool Even(int i) 
{ 
    return num % 2 == 0; //true: even, false: odd 
} 

public static void ThreadSafe() 
{ 
    bool[] arr = new bool[333]; 

    Parallel.For(0, arr.Length, index => 
    { 
     arr[index] = Even(index); 
    }); 
} 

は、今ではスレッドセーフですか?はい。 配列の各インデックスは、arrの1つの関連インデックスに値を割り当てています。 これは、並行して行うことができます。 今はどうですか?

public static void ThreadUnsafe() 
    { 
     bool[] arr = new bool[333]; 

     Parallel.For(0, arr.Length, index => 
     { 
      arr[index] = Even(index); 
      int index2 = (index + 1) < arr.Length ? (index + 1) : index; 
      arr[index2] = Even(index); 
     }); 
    } 

与えられたインデックスでは、arrに2つのインデックスを割り当てることができ、他のスレッドも同様にそれに書き込むことができます。スレッドセーフではありませんが、結果はどうなりますか?

これで、メソッドが使用されているコンテキストがスレッドの安全性を判断できることが分かりました。

スレッドセーフには複数のタイプがあります。

+1

ありがとうございます、これは私が求めていることです。今、そのような種類の安全について読んでいます。 – BlauWave

関連する問題