ParallelFor中的调用方法

时间:2017-12-05 00:04:32

标签: c# task-parallel-library

我有一个特定方法bool Method(Myobject Obj),我想在ParallelFor()循环中给他打电话。我真的能这样做吗?这是线程安全还是类似的东西?调用这样的方法感觉有点不对劲。

1 个答案:

答案 0 :(得分:1)

线程安全始终根据上下文或特定情况决定。 让我们说,你有这个:

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中的一个相关索引赋值。 因此,它可以并行完成。 但是现在呢?

   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中分配两个索引,其他一些线程也可以写入它。它不是线程安全的,因为我们不知道,结果会是什么。

现在您可以看到,使用方法的上下文也可以确定其线程安全性。

此外,还有多种类型的线程安全性。