1

私はいくつかの障壁の問題がある並列アルゴリズムを持っています。「検索」と叫ぶ前に、利用可能な投稿とリンクを確認し、Monitor.Wait と Monitor.PulseAll を使用してバリアの指示に従っていると言えますが、私の問題は、最後に作成されたものを除くすべてのスレッドです。 (そして開始された)は、メインスレッドからの PulseAll によって到達されます。コードの基本的なレイアウトは次のとおりです。

public static object signal = new object(); //This one is located as class variable, not in the method

public void RunAlgorithm(List<City> cities){
    List<Thread> localThreads = new List<Thread>();
    object[] temp = //some parameters here
    for(int i = 0; i < numOfCitiesToCheck; i++){
        Thread newThread = new Thread((o) => DoWork(o as object[]));
        newThread.IsBackground = true; 
        newThread.Priority = ThreadPriority.AboveNormal;
        newThread.Start(temp as object);
        localThreads.Add(newThread);
    }

    //All threads initiated, now we pulse all
    lock(signal){
        Monitor.PulseAll(signal); 
    }
    int counter = 0;
    while(true){
        if(counter == localThreads.Count){ break; }
        localThreads[counter].Join();
        counter++;
    }
}

これはメイン スレッドによって実行され (いくつかの不要な部分を削除)、メイン スレッドは常にリストの最後のスレッドの Join() でスタックすることは前に述べたとおりです。スレッドのメソッドは次のようになります。

private void DoWork(object[] arguments){
    lock(signal){
        Monitor.Wait(signal);
    }
    GoDoWork(arguments); 
}

このタイプのシグナリングに使用できる他のバリアはありますか? 私が望むのは、メインスレッドがすべてのスレッドに同時に信号を送って、同時に開始するようにすることだけです。可能な限り並行して実行するために、それらを同時に開始する必要があります(アルゴリズムの実行時間と他のいくつかのことを測定します)。バリアまたはコードに欠陥のある部分はありますか (バリアとは)? より少ないスレッドでインスタンスを実行しようとしましたが、それでも最後のスレッドでスタックします。なぜなのかわかりません。VS デバッグを介して、最後のスレッドがスリープしていることを確認しました (他のすべてのスレッドは !isAlive ですが、最後のスレッドは isAlive = true です)。どんな助けでも大歓迎です!

4

1 に答える 1