0

在 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++;

   }
   }

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

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

2 回答 2

1

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

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

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

祝你好运!

于 2009-04-05T19:08:07.210 回答
1

如果不详细研究代码,则存在一个明显的潜在问题,即您的内部Parallel.For循环递增并检查prefix在并行循环外部声明的变量。

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

于 2009-05-29T12:12:11.747 回答