【问题标题】:Calling method in ParallelForParallelFor 中的调用方法
【发布时间】:2017-12-05 09:53:59
【问题描述】:

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

【问题讨论】:

  • 当然可以。是否线程安全取决于方法的作用。
  • 你试过了吗?你能分享你的代码吗? Method 是吗?
  • @Icepickle 不,我还没有尝试测试它,只是想知道我的对象 Obj 是否可以与来自并行进程的另一个 Obj 或类似的东西“混合”。我应该说,在这个Method 里面没有线程交叉,只有Obj 处理。
  • 天哪,再次被否决,我们真的那么讨厌新手吗?

标签: c# task-parallel-library


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

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

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

【讨论】:

  • 谢谢先生,这是我要求的。现在要了解这些类型的安全性。
猜你喜欢
  • 2021-02-15
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多