如何确保所有循环在Parallel.For中同时完成?

时间:2009-04-05 19:01:47

标签: c# loops parallel-processing

在C#(.NET)中,我得到了2个循环 - >

A for ... do:
{
    B for do:
      { something}

something that evaluates all "for"s in B loop
}

我使用Parallel.For作为内部循环,但每次运行应用程序时这些循环的结果都不同。我认为这可能是一些异步工作的结果,但我不确定如何在VS 2005 Express中确定它,而且我不确定如果我应该做的事情就像“等到Parallel.For结束了,然后为所有这些做点什么。

编辑(由于评论要求提供更具体的信息):

 for (int i = 0; i < max; i++) //Pre Vsetky retazce ..
       {
           prefix = 0;
           tempsame.Clear();
           bool spracovane = true;
           int dlzkaI = Items[i, 1].Length;

           if (Items[i, 2] != "1") { spracovane = false; } 

           if (spracovane == false)
         //  Parallel.For(0, max, delegate(int j)
         //    {
                  for (int j = 0; j < max; j++) //Pre kazdy dalsi
                  {

                       int dlzkaJ = Items[j, 1].Length;

                       if (dlzkaJ >= dlzkaI)
                       {

                           CompareInfo myComp = CultureInfo.InvariantCulture.CompareInfo;
                           bool isprefix = myComp.IsPrefix(Items[j, 1], Items[i, 1]);


                           bool issame = false;

                           if (dlzkaJ.Equals(dlzkaI)) issame = true;

                           if (isprefix == true && issame == false)
                           {
                               prefix++;
                           }

                           else if (isprefix == true && issame == true && prefix == 0) 
                           {
                               tempsame.Add(Items[j, 0]);

                           }
                       }
                } 





   if ((prefix==0) && (spracovane==false))
   {
       Items = UpdateUnique(tempsame.ToArray(typeof(string)) as string[], Items);
       unique++;

   }
   }

简而言之,2个循环遍历相同的字符串数组,并且只选择唯一的字符串 - &gt;这意味着该字符串不能是任何其他字符串的前缀。

> Car - unique Car - unique Cafeteria -
> unique Automobile - unique Auto - not
> unique - it's prefix of Automobile
> Auto - not unique

2 个答案:

答案 0 :(得分:1)

如果你的两个看起来与外部变量或副作用有交互,那么你的结果可能最终是非确定性的。这是一个解释,你应该检查这些看起来是否有互动。看看你的循环是如何插入,考虑只在外循环上做Parallel.For

另一个解释可能是PFX还不是一个稳定的技术 - 它会产生许多奇怪的错误,所以我会等待.NET 4 / VS 2010并使用它们。

哦,如果你正在做一些数学算法并想要绝对的顶级性能,我根本就不会使用.NET - OpenMP更好,更不用说线程构建模块等了。

祝你好运!

答案 1 :(得分:1)

在没有详细研究代码的情况下,有一个明显的潜在问题,即内部Parallel.For循环递增并检查在并行循环外声明的prefix变量。

这意味着并行迭代可能会有不同的功能,具体取决于哪个线程首先递增此变量。