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 でそれを確認する方法がわかりません。次に、すべての作業を行います。

編集(より具体的な情報を要求するコメントのため):

 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 つのループは同じ文字列の配列をループし、一意の文字列のみを選択します。つまり、文字列を他の文字列のプレフィックスにすることはできません。

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

2 に答える 2

1

コードを詳細に調べることなく、1つの明らかな潜在的な問題があります。それは、内部ループが増分し、並列ループの外部で宣言された変数をParallel.For検査することです。prefix

これは、どのスレッドがこの変数を最初にインクリメントするかによって、並列反復の機能が異なる可能性があることを意味します。

于 2009-05-29T12:12:11.747 に答える
1

2 つの外観に外部変数または副作用との相互作用がある場合、結果が非​​決定的になる可能性があります。これは 1 つの説明であり、相互作用についてこれらの外観を確認する必要があります。ループがどのように挿入Parallel.Forされているかを見て、外側のループだけで行うことを検討してください。

もう 1 つの説明は、PFX はまだ安定した技術ではないということかもしれません。多くの奇妙なエラーが発生するため、.NET 4/VS 2010 を待って使用します。

ああ、もしあなたが何らかの数学アルゴリズムを実行していて、絶対的な最高のパフォーマンスが必要な場合は、.NET をまったく使用しません。スレッド化ビルディング ブロックなどは言うまでもなく、OpenMP の方がはるかに優れています。

幸運を!

于 2009-04-05T19:08:07.210 に答える