0

分子アルゴリズムをシミュレートするプログラムをJavaで書いています。分子アルゴリズムは本質的に並行性を使用するため (化学反応を供給する化学物質と濃度があれば、必要な数の化学反応を行うことができます)、並行性を使用する必要があります。

しかし、グラフ構造に使用していたパッケージがスレッドセーフではないことが最近わかりました。各スレッドに設定されたグラフの ArrayList があります。計算中に、スレッドは独自の ArrayList とその中のいくつかのグラフを変更しますが、子スレッドから 2 つの ArrayList を受け取るまで、1 つのスレッドが他のスレッドの ArrayList またはグラフを変更できるようにするコードはありません。

これを達成するために、私は ForkJoinPool を使用しています (これについての私の理解は、2 つのスレッド間でタスクを分割する 2 つのスレッド間でタスクを分割することです... 計算がリーフ スレッドで行われると、親スレッドに戻ります。ルートの子が親スレッドに戻り、ルート (ForkJoinTask の場合) が結果を返すまで続きます)。

言うまでもなく、私が望んでいることの注目すべき例外はワークスティーリングです。したがって、私の質問は、ワークスティーリングと子スレッドが親スレッドに戻ることを除いて、スレッドが他のスレッドと対話しない場合、スレッドセーフでないオブジェクトを並行アプリケーションで使用できるかどうかです。

4

1 に答える 1

0

このプロセスがマップ/リデュースに適しているかどうか疑問に思います。アルゴリズムには並行性が必要です。物理学と化学は、問題を分割する方法を示唆しています。安全で効率的な同時実行を実現する簡単な方法かもしれません。

于 2014-04-27T15:25:37.477 に答える