0

特定のスレッドが何らかの理由で失敗した場合、これにより無限ループが発生するようです。

これは私が書いたものではないため、編集することもできませんが、ここで最も明白な問題は、カウンター変数totalActionsが揮発性としてマークされていないことです。最新の値。

totalActionsの真の値を取得できない場合、待機し続けるように見えますか?

これにより、スレッドが再帰的に実行されますか? デバッグ中に、実行中のスレッドが失敗し (例外がスローされ)、何度も何度も呼び出され続けることに気付きました....

public void PerformActions(List<Action> actions)
{
   object actionLock = new object();
   int totalActions = actionts.Count;

   for(int x = 0; x < accounts.Count; x++)
   {
      int y = x;
      new Thread(delegate()
      {
        actions[y].Invoke();

        if(Interlocked.Decrement(ref totalActions) == 0)
        {
            lock(actionLock)
            {
                Monitor.Pulse(actionLock);
            }
        }
    }).Start();
   }

   lock(actionLock)
   {
        if(totalActions > 0)
        {
           Monitor.Wait(actionLock);
        }    
   }
}

アップデート

使用法は次のようなもので、myServicehttpRequestAPI サービスから json リクエストを取得するための呼び出しを行っています。

Execute.InParallel(
new Action[]
    {
    () => { abc = myService.DoSomething(); },
    () => { def = myService.DoSomethingElse(); }
    });
4

2 に答える 2

0

if(totalActions > 0)ロックはメモリバリアとして機能し、テストが現在の値を読み取ることを保証します。私は、このコードがレースフリーであるとは確信していませんが、レースは少なくとも非常にありそうにないでしょう. あなたはそれを再現するのに苦労するでしょう。

したがって、問題はここには示されていません。デバッガーを使用して、関係するスレッドが正確に何をしているのかを調べることができますか?

未処理の例外が原因で一部のスレッドが停止しているとあなたは言います。スレッドが早期に終了すると、カウントが減少しない可能性があります。

また、コードを変更できない場合、質問のポイントは何ですか? 何を提案すればよいかわかりません。

于 2013-05-01T19:55:46.633 に答える